摘要:看到下面的題,是不是已經(jīng)蒙了,讀完這篇文章,就能順利通關(guān)了沒有輸出數(shù)據(jù)類型判斷數(shù)據(jù)類型數(shù)據(jù)類型一共有種,類型判斷特殊情況由此可以看出,不能區(qū)分數(shù)組,和對象運算符返回一個布爾值,表示對象是否為某個構(gòu)造函數(shù)的實例。
前言
無論筆試還是面試,總會問到數(shù)據(jù)類型和隱式轉(zhuǎn)換。今天徹底整理一下這塊的知識,希望對大家有幫助。
看到下面的題,是不是已經(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)} //沒有輸出 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
類型判斷 typeoftypeof 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ū)分數(shù)組, null和對象
Object.prototype.toString.calllet 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運算符返回一個布爾值,表示對象是否為某個構(gòu)造函數(shù)的實例。
instanceof運算符的左邊是實例對象,右邊是構(gòu)造函數(shù)。它會檢查右邊構(gòu)建函數(shù)的原型對象(prototype),是否在左邊對象的原型鏈上。
new Date instanceof Date //true [1,2,3] instanceof Array //true
instanceof運算符只能用于對象,不適用原始類型的值。
constructor 屬性prototype對象有一個constructor屬性,默認指向prototype對象所在的構(gòu)造函數(shù)。
function P() {} P.prototype.constructor === P // true
[1,2].constructor === Array //true "123".constructor === String //true面試常問 怎么判斷是不是數(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如何判斷一個對象是不是空對象
轉(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ù)組都可以讀寫,獲取長度,遍歷,但是類數(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)換后還是原來的值 Number(324) // 324 // 字符串:如果可以被解析為數(shù)值,則轉(zhuǎn)換為相應的數(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 //對象轉(zhuǎn)化 Number({a: 1}) // NaN Number({}) //NaN //數(shù)組 Number([1, 2, 3]) // NaN Number([5]) // 5 Number([]) //0
Number方法參數(shù)是對象時轉(zhuǎn)換規(guī)則
第一步,調(diào)用對象自身的valueOf方法。如果返回原始類型的值,則直接對該值使用Number函數(shù),不再進行后續(xù)步驟。
第二步,如果valueOf方法返回的還是對象,則改為調(diào)用對象自身的toString方法。如果toString方法返回原始類型的值,則對該值使用Number函數(shù),不再進行后續(xù)步驟。
第三步,如果toString方法返回的是對象,就報錯。
轉(zhuǎn)換規(guī)則示例:
var obj = {x: 1}; Number(obj) // NaN // 等同于 if (typeof obj.valueOf() === "object") { Number(obj.toString()); } else { Number(obj.valueOf()); }
先使用valueOf返回了對象本身,再代用toString()返回了"[object Object]"
注意:
任何涉及NaN的操作都返回NaN,NaN和任何值不相等
除了以下值的轉(zhuǎn)換結(jié)果為false,其他的值全部為true。
false, "", 0, NaN, null, undefined
String函數(shù)可以將任意類型的值轉(zhuǎn)化成字符串(1)原始類型值
//數(shù)值:轉(zhuǎn)為相應的字符串。 String(123) // "123" //字符串:轉(zhuǎn)換后還是原來的值。 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)對象
//String方法的參數(shù)如果是對象,返回一個類型字符串 String({a: 1}) // "[object Object]" //如果是數(shù)組,返回該數(shù)組的字符串形式。 String([1, 2, 3]) // "1,2,3"
String方法背后的轉(zhuǎn)換規(guī)則,與Number方法基本相同,只是互換了valueOf方法和toString方法的執(zhí)行順序。
隱式類型轉(zhuǎn)換 自動轉(zhuǎn)化為布爾值if條件,while,
自動轉(zhuǎn)換為字符串主要發(fā)生在字符串加法,一個值為字符串,另一個非字符串,則后者直接轉(zhuǎn)為字符串
"5" + 1 // "51" "5" + true // "5true" "5" + {} // "5[object Object]"自動轉(zhuǎn)化為數(shù)值
除了加法運算符(+)有可能把運算子轉(zhuǎn)為字符串,其他運算符都會把運算子自動轉(zhuǎn)成數(shù)值。
++/--(自增自減運算符) + - * / %(算術(shù)運算符) + > < >= <= == != === !=== (關(guān)系運算符)
"5" - "2" // 3 "5" * "2" // 10 true - 1 // 0 false / "5" // 0 //"abc"轉(zhuǎn)為數(shù)值為NaN,NaN任何運算都是NaN "abc" - 1 // NaN //null進行Number運算轉(zhuǎn)成0 null + 1 // 1 //undefined轉(zhuǎn)為數(shù)值時為NaN undefined + 1 // NaN== 運算符
(1)原始類型的數(shù)據(jù)會轉(zhuǎn)換成數(shù)值類型再進行比較。
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 // 因為字符串轉(zhuǎn)為數(shù)字時,省略前置和后置的空格
(2)對象與原始類型值比較
對象(這里指廣義的對象,包括數(shù)組和函數(shù))與原始類型的值比較時,對象轉(zhuǎn)化成原始類型的值,再進行比較。
[1] == 1 // true // 等同于 Number([1]) == 1 [1] == "1" // true // 等同于 Number([1]) == Number("1") [1] == true // true // 等同于 Number([1]) == Number(true)實戰(zhàn)練習
//true,空數(shù)組valueOf還是空數(shù)組,toString()轉(zhuǎn)成得到空字符串,空字符串調(diào)用Number轉(zhuǎn)成0 console.log([] == 0) //true //true,非的運算級別高,空數(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個數(shù)組放在堆里面,棧中存儲的是地址 console.log([] == []) //引用類型存儲在堆中,棧中的是地址,所以是false console.log({} == {}) //{}.valueOf().toString()得到的是[object, Object], !{}得到的是false,Number轉(zhuǎn)換后不相等 console.log({} == !{}) //數(shù)組的valueOf().toString()后為空,所以是真 console.log([] == false) //true //因為對象調(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個數(shù)組的棧地址不同 if([1] == [1]){console.log(4)} //沒有輸出 //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)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/100517.html
摘要:包裝對象即,與數(shù)值字符串布爾值相對應的三個原生對象。顯示類型轉(zhuǎn)換強制轉(zhuǎn)換即,顯示調(diào)用函數(shù)進行類型轉(zhuǎn)換。返回對象的字符串數(shù)值或布爾值表示,通常與返回的值相同。 一、類型與包裝對象 1. 類型 原始類型: number string boolean null undefined Symbol 對象類型: Object Array Function 原始類型(基本類型)和對象類型(引...
摘要:如何讓根據(jù)拆箱轉(zhuǎn)換,以及的隱式轉(zhuǎn)換,可以如下寫為什么計算機中所有的數(shù)據(jù)都是以二進制存儲的,所以在計算機計算時要把數(shù)據(jù)先轉(zhuǎn)換成二進制進行計算,然后把計算結(jié)果轉(zhuǎn)換成十進制。會存在精度丟失問題和的二進制都是以無線循環(huán)的小數(shù)的二進制的二進制 本想著記筆記里,但是筆記里沒有分類,還是以文章的形式,當個人總結(jié)吧,這一篇就當作JS基礎篇的記錄吧,有修改的和新增的持續(xù)更新~ 關(guān)于JS的一些小技巧 1:...
摘要:引用數(shù)據(jù)類型引用數(shù)據(jù)類型值指保存在堆內(nèi)存中的對象。訪問方式是按引用訪問。數(shù)據(jù)類型檢測操作符是檢測基本類型的最佳工具。未定義布爾值字符串數(shù)值對象或函數(shù)用于檢測引用類型,可以檢測到它是什么類型的實例。 前端學習:教程&開發(fā)模塊化/規(guī)范化/工程化/優(yōu)化&工具/調(diào)試&值得關(guān)注的博客/Git&面試-前端資源匯總 歡迎提issues斧正:數(shù)據(jù)類型 回味,無窮! 數(shù)據(jù)類型定義 數(shù)據(jù)類型分類 基本數(shù)據(jù)...
摘要:即在這個隱式強制類型轉(zhuǎn)換中,即不會等于也不會等于。按照正常人類的腦回路,應該是將先轉(zhuǎn)換為布爾值,然后再將兩個布爾值對比。為什么和就可以避開操作符的坑呢它們進行強制類型轉(zhuǎn)換時的轉(zhuǎn)換規(guī)則又是怎樣的。 在js中,類型轉(zhuǎn)換是一個被非常多人詬病的地方。新手看了會發(fā)矇,老手看了會頭疼。 類型轉(zhuǎn)換,又成為強制類型轉(zhuǎn)換,主要區(qū)分為顯式強制類型轉(zhuǎn)換和隱式強制類型轉(zhuǎn)換 按我理解,類型轉(zhuǎn)換的意思就很明顯,就...
摘要:業(yè)務越復雜,邏輯就越復雜,判斷就越多比較判斷比較判斷是比較兩個值,返回一個布爾值,表示是否滿足比較條件。對于非布爾值的數(shù)據(jù),取反運算符會自動將其轉(zhuǎn)為布爾值。 前端學習:教程&開發(fā)模塊化/規(guī)范化/工程化/優(yōu)化&工具/調(diào)試&值得關(guān)注的博客/Git&面試-前端資源匯總 歡迎提issues斧正:========== JavaScript-判斷 代碼中,多多少少會有判斷語句。業(yè)務越復雜,邏輯就越...
閱讀 3255·2021-09-23 11:55
閱讀 2587·2021-09-13 10:33
閱讀 1656·2019-08-30 15:54
閱讀 3085·2019-08-30 15:54
閱讀 2357·2019-08-30 10:59
閱讀 2361·2019-08-29 17:08
閱讀 1793·2019-08-29 13:16
閱讀 3582·2019-08-26 12:25