數(shù)據(jù)類型
js的數(shù)據(jù)類型共有6種:
- 數(shù)值(number):整數(shù)和小數(shù)(比如1和3.14)
- 字符串(string):字符組成的文本(比如"Hello World")
- 布爾值(boolean):true(真)和false(假)兩個特定值
- undefined:表示“未定義”或不存在晒喷,即此處目前沒有任何值
- null:表示空缺,即此處應(yīng)該有一個值访敌,但目前為空
- 對象(object):各種值組成的集合
前五種屬于簡單類型凉敲,object屬于復(fù)雜類型。
對象又可以分成三個子類型寺旺。
- 狹義的對象(object)
- 數(shù)組(array)
- 函數(shù)(function)
- 正則表達(dá)式(regexp)
運算符
-
typeof:檢測數(shù)據(jù)類型爷抓。
可以檢測:number、string阻塑、boolean蓝撇、undefined、function
不可以檢測:object陈莽、array渤昌、regexp、null
//可以檢測的類型
typeof 123;// "number"
typeof '123'; // "string"
typeof false; // "boolean"
typeof a;//"undefined"
typeof function(){};//"function"
//不可以檢測的類型
typeof window走搁; // "object"
typeof {}独柑; // "object"
typeof []; // "object"
typeof null私植;// "object"
typeof /hello/;//"object"
null用
===
來檢測
var a = null;
a === null;//true
-
instanceof:檢測變量是否為一個對象的實例群嗤。
可以檢測:object、array兵琳、regexp
var o = {};
var a = [];
var b = /hello/;
o instanceof Array; // false
a instanceof Array;// true
b instanceof RegExp;//true
//因為以上數(shù)據(jù)類型都是對象
b instanceof Object;//true
a instanceof Object;//true
o instanceof Object;//true
-
+/-加號
加號:
- 在兩個操作數(shù)都是數(shù)字的時候狂秘,會做加法運算
- 兩個參數(shù)都是字符串或在有一個參數(shù)是字符串的情況下會把另外一個參數(shù)轉(zhuǎn)換為字符串做字符串拼接
- 在參數(shù)有對象的情況下會調(diào)用其valueOf或toString
- 在只有一個字符串參數(shù)的時候會嘗試將其轉(zhuǎn)換為數(shù)字
console.log(2+4);//6
console.log("2"+"4");//"24"
console.log(2+"4");//"24"
===============================
console.log(2+new Date());//"2Mon Jan 20 2014 17:15:01 GMT+0800 (China Standard Time)"
==================================
point = {x: 2, y: 8};//Object {x: 2, y: 8}
point + 3;//"[object Object]3"
radius = {r: 5, valueOf: function(r = 5){return r*r}};//Object {r: 5}
radius +3;//28
============================
console.log(+new Date());//1483066791248
console.log(+"4");//4
console.log(+true);//1
console.log(2+true);//3
console.log(+"true");//NaN
console.log("2"+"true");//2true
=================================
減號:首先將兩邊的變量轉(zhuǎn)化為數(shù)字,再進行運算
console.log(1 - "333hello");//NaN躯肌,Number( "333hello")為NaN
console.log(1 - "123");//-122
console.log(1 - false);//1
console.log(1 - true);//0
console.log(1 - undefined);//NaN
console.log(1 - null);//1
console.log(1 - " ");//1
-
==/=== 等號
===
是嚴(yán)格意義的相等者春,只需注意NaN和NaN不等就行了。
==
的時候清女,javascript會幫我們做類型轉(zhuǎn)換钱烟。
- 如果兩個值類型相同,則執(zhí)行嚴(yán)格相等的運算
- 如果兩個值的類型不同
- 如果一個是null,一個是undefined拴袭,那么相等
- 如果一個是數(shù)字读第,一個是字符串,先將字符串轉(zhuǎn)為數(shù)字拥刻,然后比較
- 如果一個值是true/false則將其轉(zhuǎn)為1/0比較
- 如果一個值是對象怜瞒,一個是數(shù)字或字符串,則嘗試使用valueOf和toString轉(zhuǎn)換后比較
- 其它就不相等了
null === undefined;//false
null == undefined;//true
==============================
NaN === NaN;//false
NaN == NaN;//false
===============================
0 === "0";//false
0 == "0";//true
"1" == true;//true
===============================
radius = {r: 5, valueOf: function(r = 5){return r*r}};//Object {r: 5}
radius === 25;//false
radius == 25;//true
==================================
undefined == "";//false
undefined == false;//false
null == "";//false
null == false;//false
"" == false;//true
- && 和 ||
JS 的 &&
和 ||
一般都不會返回true
/ false
般哼,而是返回最后一次短路的值吴汪。
短路原理:
&&
:左值為false,整個表達(dá)式為左值;左值為true,整個表達(dá)式為右值
||
:左值為false稚配,整個表達(dá)式為右值;左值為true霜运,整個表達(dá)式為左值
參考文章:全面解析JavaScript中“&&”和“||”
JavaScript的“&&”和“||”操作符總結(jié)
js 與或運算符 || && 妙用
mdn邏輯運算符
其他
NaN:Not a Number。非有效數(shù)值蒋腮,typeof NaN的值為"number"淘捡。NaN和任何值都不相等,包括它自己徽惋,即NaN == NaN
為false案淋。
運算符優(yōu)先級
mdn參考文檔
在所有的表達(dá)式中,運算的順序由運算符的優(yōu)先級和結(jié)合性決定险绘。
運算符的優(yōu)先級:決定了表達(dá)式中運算執(zhí)行的先后順序踢京,優(yōu)先級高的運算符最先被執(zhí)行。
運算符的結(jié)合性:決定了擁有相同優(yōu)先級的運算符的執(zhí)行順序宦棺。例如:i + + +j + +
瓣距,因為++
為右結(jié)合,所以改表達(dá)式等價于(i + + ) + (j+ + )
代咸。
(注:++
運算只能作用于變量蹈丸,不能作用于常量和表達(dá)式,即++i++
是錯誤的寫法呐芥。)
一般來說
- 一目運算優(yōu)先級高與二/三目運算
- 一目運算逻杖、三目運算、賦值運算多為右結(jié)合思瘟。例如:
w = a: b: c ? d : e? f : g
等價于w = a? b : (c? d: (e? f : g))
荸百。 - 運算符的大致優(yōu)先級為:一目運算、+/-/*/%滨攻、位運算符够话、比較運算符蓝翰、邏輯運算符、賦值運算符
例如:a+++b
- 按照優(yōu)先級:后置遞增 > 前置遞增 > 加號女嘲,及等價于`(a++)+b`畜份。
- 按照結(jié)合性:`++`為從右向左結(jié)合,根據(jù)結(jié)合性的定義欣尼,`a++`優(yōu)先級高于`++b`爆雹,所以先進行`a++`運算。