亚洲中字慕日产2020,大陆极品少妇内射AAAAAA,无码av大香线蕉伊人久久,久久精品国产亚洲av麻豆网站

資訊專(zhuān)欄INFORMATION COLUMN

JavaScript數(shù)據(jù)類(lèi)型中易被忽略的點(diǎn)

widuu / 2414人閱讀

摘要:只比較值得結(jié)果,,裝換為數(shù)值后就是,但是當(dāng)他們是數(shù)組中的一項(xiàng),或字符串時(shí)并非是空的。再看一個(gè)比較奇怪的例子首先,看右邊,邏輯非對(duì)進(jìn)行布爾轉(zhuǎn)換,依據(jù)上面的裝換表,數(shù)組其實(shí)也是對(duì)象,裝換為真。

String

字符串中可以包含由反斜杠和字符構(gòu)成的特殊字符,如 換行, 退格,f 換頁(yè), 回車(chē), Tab;

var multiLine = " first 
 second 
 third line "
alert(multiLine) // alerts 3 lines

""當(dāng)做轉(zhuǎn)義符號(hào)也可以避免一些問(wèn)題,如

var str = "I"m the Valrus"

當(dāng)計(jì)算字符串長(zhǎng)度時(shí),特殊字符也會(huì)參與計(jì)算,如:

var str = "My
" // 3 .`
`也算其中之一
alert(str.length)  // 3

javascript中的字符串只能讀取不能改變;

javascript中有兩種查找子字符串的方法,indexOflastIndexOf,返回找到的第一個(gè)字符的位置,沒(méi)找到返回-1;

逐位運(yùn)算符~not,~n相當(dāng)于 -(n+1),if ~indexOf相當(dāng)于if found;

取得子字符串的三種方法substr, substring, slice,可以Google找到它們之間的差異,也可以從后文鏈接中找到;

字符串的筆記

字符串逐位比較,一旦比較出大小就不再往后比較;"Bob" > "Bar" // true, because o > a,alert("2" > "14"); // true

字符裝換為ASCII碼比較

當(dāng)有數(shù)值參與比較時(shí),會(huì)把字符串也轉(zhuǎn)換為數(shù)值,如alert(2 > "14"); // false

Number, Math

JavaScript中的數(shù)值采用雙精度(IEEE 754),每個(gè)數(shù)占8byte;

JavaScript可以識(shí)別十六進(jìn)制(0xFF),八進(jìn)制(010)以及科學(xué)計(jì)數(shù)方法的數(shù)字(3e5);

Infinity-Infinity是兩個(gè)特殊的值,它們大于或小于任何值,對(duì)它們進(jìn)行運(yùn)算后依舊會(huì)得到Infinity,二者相除會(huì)得到NaN,并不會(huì)報(bào)錯(cuò);

當(dāng)一個(gè)數(shù)學(xué)運(yùn)算符不能被正確執(zhí)行時(shí)會(huì)得到NaN(0/0),它不等于包括其本身的任何數(shù)值,只可有isNaN函數(shù)檢查;

除了雙向的加號(hào),其它所有的運(yùn)算符都會(huì)把數(shù)值形式的字符串轉(zhuǎn)換為數(shù)值;alert( -"12.34" / "2" ) // -6.17;

不能轉(zhuǎn)換則返回NaN;

一個(gè)由空白符組成的字符串會(huì)被轉(zhuǎn)化為0;

如果字符串首字母非數(shù)字,parseInt/parseFloat會(huì)返回NaN,alert( parseInt("a123") )//NaN;

JavaScript中的數(shù)值計(jì)算存在精度問(wèn)題(alert(0.1 + 0.2 == 0.3)//false)(浮點(diǎn)數(shù)不能被二進(jìn)制精確的表示),解決方法可以先轉(zhuǎn)化為整數(shù),再除以10alert( (0.1*10 + 0.2*10) / 10 ) // 0.3,也可以使用toFixed;

Array

shift,pop刪除對(duì)應(yīng)項(xiàng),并返回該項(xiàng);

unshift,push;

join,split;

如果給數(shù)組的length賦值低于數(shù)組實(shí)際的長(zhǎng)度,會(huì)刪除超過(guò)的項(xiàng);

push,pop直接操作最后一項(xiàng),其運(yùn)行速度快,效率高;

shift,unshift操作第一項(xiàng),需要記住整個(gè)數(shù)組,效率低;

數(shù)組中的length方法(屬性) 其實(shí)是last index+1,

var fruits = [] // empty array
fruits[1] = "Peach"
fruits[99] = "Apple"
alert(fruits.length)  // 100 (but 2 elements)

對(duì)數(shù)組也可以使用delete,但是只會(huì)刪除該項(xiàng)的值,不會(huì)真的刪除該項(xiàng);

splice在原數(shù)組上更改和slice返回原數(shù)組的一個(gè)片段(新數(shù)組);

sort默認(rèn)把內(nèi)容轉(zhuǎn)化為string,然后根據(jù)ASCII碼比較;

new Array返回的是具有指定長(zhǎng)度的值為空的數(shù)組;

Objects

obj.propobj[prop]二者都可以訪問(wèn)對(duì)象中的一項(xiàng),但是值得注意的是obj.prop里prop是該項(xiàng)的名稱(chēng),obj[prop]里的prop是該項(xiàng)的值,此時(shí)prop是字符串,應(yīng)該加引號(hào);

alert("key" in obj) // true, key exists使用in運(yùn)算符可以用來(lái)確定是否存在某一項(xiàng);

使用for in時(shí),子項(xiàng)處理順序不確定,不同瀏覽器有所差別;

對(duì)象中可以?xún)?chǔ)存一切類(lèi)型,包括函數(shù);

可以利用對(duì)象實(shí)現(xiàn)鏈?zhǔn)秸{(diào)用,其關(guān)鍵在于每次的返回值為this;

var ladder = {
  step: 0,
  up: function() {
    this.step++
    return this
  },
  down: function() {
    this.step--
    return this
  },
  showStep: function() {
    alert(this.step)
    return this
  }
}
ladder.up().up().down().up().down().showStep()  // 1

使用構(gòu)造函數(shù)創(chuàng)建對(duì)象時(shí),var animal = new Animal()var animal = new Animal等同;

使用構(gòu)造函數(shù)創(chuàng)建對(duì)象時(shí),其關(guān)鍵在于this,如果構(gòu)造函數(shù)返回了一個(gè)對(duì)象則會(huì)忽略this;

JS中存在Math,Date,RegExp三種內(nèi)置對(duì)象,函數(shù)從某種程度上來(lái)說(shuō)也是對(duì)象,String,Number,Booleans三者比較特殊,它們各自擁有一些方法;

對(duì)象轉(zhuǎn)換為簡(jiǎn)單數(shù)據(jù)類(lèi)型 轉(zhuǎn)化為字符串

如果對(duì)象中存在toString方法,且返回一個(gè)簡(jiǎn)單類(lèi)型數(shù)據(jù),那么就返回這個(gè)字符串(所有數(shù)組默認(rèn)擁有,所以一般執(zhí)行到此完畢);

默認(rèn)

alert( {key: "value"} ) // toString for Objects outputs: [object Object]
alert( [1,2] )          // toString for Arrays lists elements "1,2"
alert( new Date )       // toString for Dates outputs the date as a string

可以自己定義一個(gè)toString方法

var user = {
firstName: "John",
toString: function() {
  return "User " + this.firstName
}
}
alert( user )  // User John

如果存在valueOf方法,且返回一個(gè)簡(jiǎn)單類(lèi)型數(shù)據(jù),那么返回這個(gè);

alert()會(huì)觸發(fā)裝換為字符串

轉(zhuǎn)換為數(shù)值(兩種情況下發(fā)生,非常常見(jiàn))

對(duì)數(shù)值進(jìn)行計(jì)算的方法( Math.sin(obj),isNaN(obj))以及運(yùn)算符(+,-,*,/等等)

做比較時(shí)(注:obj1==obj2,只有二者引用同一對(duì)象時(shí)才相等);Number(obj)也會(huì)轉(zhuǎn)換,

數(shù)值轉(zhuǎn)換規(guī)則如下

如果存在valueOf方法,且返回一個(gè)簡(jiǎn)單類(lèi)型數(shù)據(jù),那么返回這個(gè)結(jié)果;

如果對(duì)象中存在toString方法,且返回一個(gè)簡(jiǎn)單類(lèi)型數(shù)據(jù),那么就返回這個(gè)字符串;

alert( new Date() ) // The date in human-readable form
alert( +new Date() ) // Microseconds till 1 Jan 1970

自己定義一個(gè)valueOf方法

  var room = {
    num: 777,
    valueOf: function() {
      return this.num
    }
  }
  alert( +room )  // 777

不存在valueOf方法,但是存在toString方法時(shí)會(huì)調(diào)用此方法

  var room = {
    num: 777,
    toString: function() {
      return this.num
    }
  }
  alert( room / 3 )  // 259

注意只需要返回簡(jiǎn)單數(shù)值類(lèi)型即可(Numeric,String,Boolean),不一定非要返回?cái)?shù)值;

裝換為布爾值

裝換表
|Value | Converted to…|

true/false no conversion
undefined, null false
Number 0, NaN become false, others - true.
String "" becomes false, any other - true
Object true

注意,字符"0"為true;

涉及到邏輯運(yùn)算符會(huì)觸發(fā)布爾裝換;

但是也有比較奇怪的地方,看下面兩例

  alert( [0] == 0 )  // true
  alert( "
0
" == 0 ) // true
  alert( "
0
" == false ) // true
// 
  if ([0]) alert(1)  // 1, if treats [0] as true
  if ("
0
") alert(2) // 2, if treats "
0
" as true

仔細(xì)想想如何轉(zhuǎn)換的,就可以理解了。==只比較值得結(jié)果,[0],“0”裝換為數(shù)值后就是0,但是當(dāng)他們是數(shù)組中的一項(xiàng),或字符串時(shí)并非是空的。

再看一個(gè)比較奇怪的例子

alert( [] == ![] ) // true

首先,看右邊![],邏輯非對(duì)[]進(jìn)行布爾轉(zhuǎn)換,依據(jù)上面的裝換表,數(shù)組其實(shí)也是對(duì)象,object裝換為真。所以右邊![] = !true = false;

再看左邊,對(duì)象與簡(jiǎn)單類(lèi)型比較時(shí),會(huì)按數(shù)值方式裝換,沒(méi)有valueOf,將使用toString進(jìn)行裝換(以逗號(hào)分隔的字符串)那么就裝換為一個(gè)空的字符串""=false;

所以二者相等;

檢測(cè)一下你是否真的掌握了數(shù)值裝換,看看下面的題目能不能理解

6 / "3" = 2
"2" * "3" = 6
4 + 5 + "px" = "9px"
"$" + 4 + 5 = "$45"
"4" - 2 = 2
"4px" - 2 = NaN
7 / 0 = Infinity
{}[0] = undefined
parseInt("09") = "0" or "9" // octal or decimal, depends on the browser
5 && 2 = 2
2 && 5 = 5
5 || 0 = 5
0 || 5 = 5
說(shuō)明

本文對(duì)各類(lèi)型并未做詳盡的說(shuō)明,想了解更多資料可以參考以下文章

Mastering data types

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://www.ezyhdfw.cn/yun/86410.html

相關(guān)文章

  • [總結(jié)貼] 十個(gè) JavaScript 中易犯的小錯(cuò)誤

    摘要:但是在中,的生命還會(huì)繼續(xù)。這其中最典型的問(wèn)題便是批量增加元素。這時(shí),如果構(gòu)造函數(shù)被調(diào)用時(shí)沒(méi)有參數(shù),則會(huì)自動(dòng)設(shè)置為。因?yàn)閺南到y(tǒng)的角度來(lái)說(shuō),當(dāng)你用字符串的時(shí)候,它會(huì)被傳進(jìn)構(gòu)造函數(shù),并且重新調(diào)用另一個(gè)函數(shù)。 序言 在今天,JavaScript已經(jīng)成為了網(wǎng)頁(yè)編輯的核心。尤其是過(guò)去的幾年,互聯(lián)網(wǎng)見(jiàn)證了在SPA開(kāi)發(fā)、圖形處理、交互等方面大量JS庫(kù)的出現(xiàn)。 如果初次打交道,很多人會(huì)覺(jué)得js很簡(jiǎn)單...

    icattlecoder 評(píng)論0 收藏0
  • javaScript中的函數(shù)應(yīng)用

    摘要:概要當(dāng)中的函數(shù)站在不同的角度有不同的分類(lèi)和應(yīng)用本文站在高階函數(shù)的角度來(lái)討論當(dāng)中函數(shù)的應(yīng)用場(chǎng)景。解決老版本瀏覽器函數(shù)兼容性問(wèn)題判斷數(shù)據(jù)類(lèi)型高階函數(shù)實(shí)現(xiàn)也就是面向切面編程在中這個(gè)概念基礎(chǔ)且重要。 概要 js當(dāng)中的函數(shù)站在不同的角度有不同的分類(lèi)和應(yīng)用,本文站在高階函數(shù)的角度來(lái)討論js當(dāng)中函數(shù)的應(yīng)用場(chǎng)景。 首先明確高階函數(shù)定義: 函數(shù)可以作為參數(shù)被傳遞 函數(shù)可以作為返回值輸出 應(yīng)用場(chǎng)景 函...

    Michael_Ding 評(píng)論0 收藏0
  • javaScript中的函數(shù)應(yīng)用

    摘要:概要當(dāng)中的函數(shù)站在不同的角度有不同的分類(lèi)和應(yīng)用本文站在高階函數(shù)的角度來(lái)討論當(dāng)中函數(shù)的應(yīng)用場(chǎng)景。解決老版本瀏覽器函數(shù)兼容性問(wèn)題判斷數(shù)據(jù)類(lèi)型高階函數(shù)實(shí)現(xiàn)也就是面向切面編程在中這個(gè)概念基礎(chǔ)且重要。 概要 js當(dāng)中的函數(shù)站在不同的角度有不同的分類(lèi)和應(yīng)用,本文站在高階函數(shù)的角度來(lái)討論js當(dāng)中函數(shù)的應(yīng)用場(chǎng)景。 首先明確高階函數(shù)定義: 函數(shù)可以作為參數(shù)被傳遞 函數(shù)可以作為返回值輸出 應(yīng)用場(chǎng)景 函...

    wenhai.he 評(píng)論0 收藏0
  • 給自己的Fonts教程

    摘要:書(shū)體宋體仿宋體黑體等例如自帶的宋體實(shí)為中易宋體。傳統(tǒng)上說(shuō)的等線體以當(dāng)代視角來(lái)看通常是較為幼細(xì)的黑體。前面的過(guò)程我們稱(chēng)之為編碼,后面的這個(gè)過(guò)程我們稱(chēng)之為解碼。部分瀏覽器比如可以選擇編碼自動(dòng)檢測(cè)功能,使用基于統(tǒng)計(jì)的方法判斷未定編碼。 準(zhǔn)備工作 字符 - Character 字母、數(shù)字、漢字、符號(hào)等,是一種抽象實(shí)體。 字形 - Glyph 單個(gè)「字符」的具體表達(dá),一個(gè)字可有多個(gè)不同的字形。 ...

    pkwenda 評(píng)論0 收藏0
  • 11個(gè)教程中不常提及的JavaScript小技巧

    摘要:這被稱(chēng)為短路求值工作原理與運(yùn)算符將會(huì)返回第一個(gè)的值。當(dāng)所有的操作數(shù)都是時(shí),將返回最后一個(gè)表達(dá)式的結(jié)果?;蜻\(yùn)算符將返回第一個(gè)的值。 這次我們主要來(lái)分享11個(gè)在日常教程中不常被提及的JavaScript小技巧,他們往往在我們的日常工作中經(jīng)常出現(xiàn),但是我們又很容易忽略。 1、過(guò)濾唯一值 Set類(lèi)型是在ES6中新增的,它類(lèi)似于數(shù)組,但是成員的值都是唯一的,沒(méi)有重復(fù)的值。結(jié)合擴(kuò)展運(yùn)算符(...)...

    WilsonLiu95 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<