成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

js數(shù)據(jù)類型判斷和轉(zhuǎn)換

xinhaip / 3216人閱讀

摘要:看到下面的題,是不是已經(jīng)蒙了,讀完這篇文章,就能順利通關(guān)了沒(méi)有輸出數(shù)據(jù)類型判斷數(shù)據(jù)類型數(shù)據(jù)類型一共有種,類型判斷特殊情況由此可以看出,不能區(qū)分?jǐn)?shù)組,和對(duì)象運(yùn)算符返回一個(gè)布爾值,表示對(duì)象是否為某個(gè)構(gòu)造函數(shù)的實(shí)例。

前言

無(wú)論筆試還是面試,總會(huì)問(wèn)到數(shù)據(jù)類型和隱式轉(zhuǎn)換。今天徹底整理一下這塊的知識(shí),希望對(duì)大家有幫助。

看到下面的題,是不是已經(jīng)蒙了,讀完這篇文章,就能順利通關(guān)了

console.log([] == 0) //true 

console.log(![] == 0)  //true 

console.log([] == ![]) //true

console.log([] == []) //false

console.log({} == {}) //false

console.log({} == !{}) //false

console.log([] == false) //true

console.log({} == false) //false

if([]) {console.log(3)} //3 

if([1] == [1]){console.log(4)} //沒(méi)有輸出

console.log("2" > 10) //false

console.log("2" > "10") //true
數(shù)據(jù)類型判斷 數(shù)據(jù)類型

js數(shù)據(jù)類型一共有7種,undefined、 null、 boolean 、string、 number、 object、 Symbol

類型判斷 typeof
typeof undefined //undefined
typeof true //boolean
typeof 42 //number
typeof "42" //string
typeof { life: 42 } //object
let s = Symbol();
typeof s //symbol

//特殊情況
typeof [1,2,3,4]// object
typeof null //object
typeof new Date()  //object
typeof function () {}  //function

由此可以看出,typeof不能區(qū)分?jǐn)?shù)組, null和對(duì)象

Object.prototype.toString.call
let getType=Object.prototype.toString;

getType.call(undefined) //[object Undefined]

console.log(getType.call(true)) //[object Boolean]

console.log(getType.call(42)) //[object Number]

console.log(getType.call(Symbol()))//[object Symbol]

console.log(getType.call([1,2,3,4])) //[object Array]

console.log(getType.call(null))//[object Null]

console.log(getType.call(new Date())) //[object Date]

console.log(getType.call(function () {} )) //[object Function]
instanceof

instanceof運(yùn)算符返回一個(gè)布爾值,表示對(duì)象是否為某個(gè)構(gòu)造函數(shù)的實(shí)例。

instanceof運(yùn)算符的左邊是實(shí)例對(duì)象,右邊是構(gòu)造函數(shù)。它會(huì)檢查右邊構(gòu)建函數(shù)的原型對(duì)象(prototype),是否在左邊對(duì)象的原型鏈上。

new Date instanceof Date //true
[1,2,3] instanceof Array //true

instanceof運(yùn)算符只能用于對(duì)象,不適用原始類型的值。

constructor 屬性

prototype對(duì)象有一個(gè)constructor屬性,默認(rèn)指向prototype對(duì)象所在的構(gòu)造函數(shù)。

function P() {}
P.prototype.constructor === P // true
[1,2].constructor === Array //true
"123".constructor === String //true
面試常問(wèn) 怎么判斷是不是數(shù)組

instanceof、constructor、Object.prototype.toString.call、Array.isArray

[1,2] instanceof Array //true
[1,2].constructor === Array //true
Object.prototype.toString.call([1,2]) === "[object Array]" //true
Array.isArray([1,2]) //true
如何判斷一個(gè)對(duì)象是不是空對(duì)象

轉(zhuǎn)換成json字符串判斷

JSON.stringify({}) == "{}"

for in 循環(huán)判斷

let isEmptyObject = function(obj) {
    for (let key in obj) {
        return false;
    }
    return true;
}
console.log(isEmptyObject(obj));//true

使用ES6的Object.keys()

Object.keys({}).length === 0
類似的數(shù)組轉(zhuǎn)化成數(shù)組

類數(shù)組和數(shù)組都可以讀寫,獲取長(zhǎng)度,遍歷,但是類數(shù)組不能調(diào)用數(shù)組的方法,比如push等

Array.prototype.slice.call(arguments)

或者Array.from(arguments)

字符串翻轉(zhuǎn)

"abc".split("").reverse().join("")

字符串和數(shù)組轉(zhuǎn)換

["a", "b", "c"].join("") //"abc"

"abc".split("") //["a", "b", "c"]
類型轉(zhuǎn)換 顯示類型轉(zhuǎn)換 轉(zhuǎn)成數(shù)字,Number()、parseInt()、parseFloat()
// 數(shù)值:轉(zhuǎn)換后還是原來(lái)的值
Number(324) // 324

// 字符串:如果可以被解析為數(shù)值,則轉(zhuǎn)換為相應(yīng)的數(shù)值
Number("324") // 324

// 字符串:如果不可以被解析為數(shù)值,返回 NaN
Number("324abc") // NaN

// 空字符串轉(zhuǎn)為0
Number("") // 0

// 布爾值:true 轉(zhuǎn)成 1,false 轉(zhuǎn)成 0
Number(true) // 1
Number(false) // 0

// undefined:轉(zhuǎn)成 NaN
Number(undefined) // NaN

// null:轉(zhuǎn)成0
Number(null) // 0

//對(duì)象轉(zhuǎn)化
Number({a: 1}) // NaN
Number({}) //NaN 

//數(shù)組
Number([1, 2, 3]) // NaN
Number([5]) // 5
Number([]) //0

Number方法參數(shù)是對(duì)象時(shí)轉(zhuǎn)換規(guī)則

第一步,調(diào)用對(duì)象自身的valueOf方法。如果返回原始類型的值,則直接對(duì)該值使用Number函數(shù),不再進(jìn)行后續(xù)步驟。

第二步,如果valueOf方法返回的還是對(duì)象,則改為調(diào)用對(duì)象自身的toString方法。如果toString方法返回原始類型的值,則對(duì)該值使用Number函數(shù),不再進(jìn)行后續(xù)步驟。

第三步,如果toString方法返回的是對(duì)象,就報(bào)錯(cuò)。

轉(zhuǎn)換規(guī)則示例:

var obj = {x: 1};
Number(obj) // NaN

// 等同于
if (typeof obj.valueOf() === "object") {
  Number(obj.toString());
} else {
  Number(obj.valueOf());
}

先使用valueOf返回了對(duì)象本身,再代用toString()返回了"[object Object]"

注意:
任何涉及NaN的操作都返回NaN,NaN和任何值不相等

Boolean

除了以下值的轉(zhuǎn)換結(jié)果為false,其他的值全部為true。

false, "", 0, NaN, null, undefined

String函數(shù)可以將任意類型的值轉(zhuǎn)化成字符串

(1)原始類型值

//數(shù)值:轉(zhuǎn)為相應(yīng)的字符串。
String(123) // "123"

//字符串:轉(zhuǎn)換后還是原來(lái)的值。
String("abc") // "abc"

//布爾值:true轉(zhuǎn)為字符串"true",false轉(zhuǎn)為字符串"false"。
String(true) // "true"

//undefined:轉(zhuǎn)為字符串"undefined"。
String(undefined) // "undefined"


//null:轉(zhuǎn)為字符串"null"。
String(null) // "null"

(2)對(duì)象

//String方法的參數(shù)如果是對(duì)象,返回一個(gè)類型字符串
String({a: 1}) // "[object Object]"


//如果是數(shù)組,返回該數(shù)組的字符串形式。
String([1, 2, 3]) // "1,2,3"

String方法背后的轉(zhuǎn)換規(guī)則,與Number方法基本相同,只是互換了valueOf方法和toString方法的執(zhí)行順序。

隱式類型轉(zhuǎn)換 自動(dòng)轉(zhuǎn)化為布爾值

if條件,while,

自動(dòng)轉(zhuǎn)換為字符串

主要發(fā)生在字符串加法,一個(gè)值為字符串,另一個(gè)非字符串,則后者直接轉(zhuǎn)為字符串

"5" + 1 // "51"
"5" + true // "5true"
"5" + {} // "5[object Object]"
自動(dòng)轉(zhuǎn)化為數(shù)值

除了加法運(yùn)算符(+)有可能把運(yùn)算子轉(zhuǎn)為字符串,其他運(yùn)算符都會(huì)把運(yùn)算子自動(dòng)轉(zhuǎn)成數(shù)值。

++/--(自增自減運(yùn)算符) 

+ - * / %(算術(shù)運(yùn)算符) 

+ > < >= <= == != === !=== (關(guān)系運(yùn)算符)
"5" - "2" // 3
"5" * "2" // 10
true - 1  // 0
false / "5" // 0

//"abc"轉(zhuǎn)為數(shù)值為NaN,NaN任何運(yùn)算都是NaN
"abc" - 1   // NaN

//null進(jìn)行Number運(yùn)算轉(zhuǎn)成0
null + 1 // 1

//undefined轉(zhuǎn)為數(shù)值時(shí)為NaN
undefined + 1 // NaN
== 運(yùn)算符

(1)原始類型的數(shù)據(jù)會(huì)轉(zhuǎn)換成數(shù)值類型再進(jìn)行比較。

1 == true // true
// 等同于 1 === Number(true)

0 == false // true
// 等同于 0 === Number(false)

2 == true // false
// 等同于 2 === Number(true)


"true" == true // false
// 等同于 Number("true") === Number(true)
// 等同于 NaN === 1

"" == 0 // true
// 等同于 Number("") === 0
// 等同于 0 === 0

"" == false  // true
// 等同于 Number("") === Number(false)
// 等同于 0 === 0

"1" == true  // true
// 等同于 Number("1") === Number(true)
// 等同于 1 === 1

"
  123  	" == 123 // true
// 因?yàn)樽址D(zhuǎn)為數(shù)字時(shí),省略前置和后置的空格

(2)對(duì)象與原始類型值比較

對(duì)象(這里指廣義的對(duì)象,包括數(shù)組和函數(shù))與原始類型的值比較時(shí),對(duì)象轉(zhuǎn)化成原始類型的值,再進(jìn)行比較。

[1] == 1 // true
// 等同于 Number([1]) == 1

[1] == "1" // true
// 等同于 Number([1]) == Number("1")

[1] == true // true
// 等同于 Number([1]) == Number(true)
實(shí)戰(zhàn)練習(xí)
//true,空數(shù)組valueOf還是空數(shù)組,toString()轉(zhuǎn)成得到空字符串,空字符串調(diào)用Number轉(zhuǎn)成0
console.log([] == 0) //true 

//true,非的運(yùn)算級(jí)別高,空數(shù)組轉(zhuǎn)為布爾值為true,所以![]得到的false,Number轉(zhuǎn)換為0, 最后結(jié)果還是true
console.log(![] == 0)  //true 

//true,前面是調(diào)用valueOf()后調(diào)用toString()轉(zhuǎn)成false,后邊是非轉(zhuǎn)成false
console.log([] == ![]) 


//false,2個(gè)數(shù)組放在堆里面,棧中存儲(chǔ)的是地址
console.log([] == []) 

//引用類型存儲(chǔ)在堆中,棧中的是地址,所以是false
console.log({} == {}) 

//{}.valueOf().toString()得到的是[object, Object], !{}得到的是false,Number轉(zhuǎn)換后不相等
console.log({} == !{})

//數(shù)組的valueOf().toString()后為空,所以是真
console.log([] == false) //true

//因?yàn)閷?duì)象調(diào)用valueOf后為{}, toString后轉(zhuǎn)為[object, Object],Number后是NaN,
//任何涉及NaN的操作都返回NaN,NaN和任何值不相等
console.log({} == false) //false

//空數(shù)組的boolean值為true
if([]) {console.log(3)} //3 

//2個(gè)數(shù)組的棧地址不同
if([1] == [1]){console.log(4)} //沒(méi)有輸出

//false,轉(zhuǎn)成2>10
console.log("2" > 10) 

//都是字符串,按照字符串的unicode轉(zhuǎn)換,"2".charCodeAt() > "10".charCodeAt = 50 > 49
console.log("2" > "10") 

//都是字符串,按照字符串的unicode轉(zhuǎn)換
console.log("abc" > "b") //false

參考:http://javascript.ruanyifeng....

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

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

相關(guān)文章

  • JS重要知識(shí)點(diǎn)記錄(一)

    摘要:包裝對(duì)象即,與數(shù)值字符串布爾值相對(duì)應(yīng)的三個(gè)原生對(duì)象。顯示類型轉(zhuǎn)換強(qiáng)制轉(zhuǎn)換即,顯示調(diào)用函數(shù)進(jìn)行類型轉(zhuǎn)換。返回對(duì)象的字符串?dāng)?shù)值或布爾值表示,通常與返回的值相同。 一、類型與包裝對(duì)象 1. 類型 原始類型: number string boolean null undefined Symbol 對(duì)象類型: Object Array Function 原始類型(基本類型)和對(duì)象類型(引...

    HtmlCssJs 評(píng)論0 收藏0
  • JS】關(guān)于JS的一些知識(shí)點(diǎn)(JS基礎(chǔ),純記錄)

    摘要:如何讓根據(jù)拆箱轉(zhuǎn)換,以及的隱式轉(zhuǎn)換,可以如下寫為什么計(jì)算機(jī)中所有的數(shù)據(jù)都是以二進(jìn)制存儲(chǔ)的,所以在計(jì)算機(jī)計(jì)算時(shí)要把數(shù)據(jù)先轉(zhuǎn)換成二進(jìn)制進(jìn)行計(jì)算,然后把計(jì)算結(jié)果轉(zhuǎn)換成十進(jìn)制。會(huì)存在精度丟失問(wèn)題和的二進(jìn)制都是以無(wú)線循環(huán)的小數(shù)的二進(jìn)制的二進(jìn)制 本想著記筆記里,但是筆記里沒(méi)有分類,還是以文章的形式,當(dāng)個(gè)人總結(jié)吧,這一篇就當(dāng)作JS基礎(chǔ)篇的記錄吧,有修改的和新增的持續(xù)更新~ 關(guān)于JS的一些小技巧 1:...

    SwordFly 評(píng)論0 收藏0
  • 溫故js系列(1)-基本數(shù)據(jù)類型引用數(shù)據(jù)類型判斷&存儲(chǔ)訪問(wèn)&類型轉(zhuǎn)換

    摘要:引用數(shù)據(jù)類型引用數(shù)據(jù)類型值指保存在堆內(nèi)存中的對(duì)象。訪問(wèn)方式是按引用訪問(wèn)。數(shù)據(jù)類型檢測(cè)操作符是檢測(cè)基本類型的最佳工具。未定義布爾值字符串?dāng)?shù)值對(duì)象或函數(shù)用于檢測(cè)引用類型,可以檢測(cè)到它是什么類型的實(shí)例。 前端學(xué)習(xí):教程&開(kāi)發(fā)模塊化/規(guī)范化/工程化/優(yōu)化&工具/調(diào)試&值得關(guān)注的博客/Git&面試-前端資源匯總 歡迎提issues斧正:數(shù)據(jù)類型 回味,無(wú)窮! 數(shù)據(jù)類型定義 數(shù)據(jù)類型分類 基本數(shù)據(jù)...

    jone5679 評(píng)論0 收藏0
  • js類型轉(zhuǎn)化三兩事兒

    摘要:即在這個(gè)隱式強(qiáng)制類型轉(zhuǎn)換中,即不會(huì)等于也不會(huì)等于。按照正常人類的腦回路,應(yīng)該是將先轉(zhuǎn)換為布爾值,然后再將兩個(gè)布爾值對(duì)比。為什么和就可以避開(kāi)操作符的坑呢它們進(jìn)行強(qiáng)制類型轉(zhuǎn)換時(shí)的轉(zhuǎn)換規(guī)則又是怎樣的。 在js中,類型轉(zhuǎn)換是一個(gè)被非常多人詬病的地方。新手看了會(huì)發(fā)矇,老手看了會(huì)頭疼。 類型轉(zhuǎn)換,又成為強(qiáng)制類型轉(zhuǎn)換,主要區(qū)分為顯式強(qiáng)制類型轉(zhuǎn)換和隱式強(qiáng)制類型轉(zhuǎn)換 按我理解,類型轉(zhuǎn)換的意思就很明顯,就...

    vpants 評(píng)論0 收藏0
  • 溫故js系列(9)-相等==&嚴(yán)格相等===&代碼里的那些判斷

    摘要:業(yè)務(wù)越復(fù)雜,邏輯就越復(fù)雜,判斷就越多比較判斷比較判斷是比較兩個(gè)值,返回一個(gè)布爾值,表示是否滿足比較條件。對(duì)于非布爾值的數(shù)據(jù),取反運(yùn)算符會(huì)自動(dòng)將其轉(zhuǎn)為布爾值。 前端學(xué)習(xí):教程&開(kāi)發(fā)模塊化/規(guī)范化/工程化/優(yōu)化&工具/調(diào)試&值得關(guān)注的博客/Git&面試-前端資源匯總 歡迎提issues斧正:========== JavaScript-判斷 代碼中,多多少少會(huì)有判斷語(yǔ)句。業(yè)務(wù)越復(fù)雜,邏輯就越...

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

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

0條評(píng)論

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