JavaScript 的数据类型
- 数值(number):整数和小数(例如1和3.14)
- 字符串(string):字符组成的文本(比如
"Hello World"
) - 布尔值(boolean):
true
(真)和false
(假)两个特定值 - undefined:表示“未定义”或不存在,即此处目前没有任何值
- null:表示空缺,即此处应该有一个值,但目前为空
- 对象(object):各种值组成的集合
- Symbol:ES6引入的,一种类似于字符串的原始类型的值,由Symbol函数生成,每一个值都是独一无二的
原始类型和复杂类型(对象类型)
原始类型 | 复杂类型 |
---|---|
数值、字符串、布尔值、Symbol | 对象 |
JavaScript中有两个特殊的原始值(不可更改:任何方法都无法更改、突变一个原始值),他们不是数字、字符串和布尔值,通常分别代表各自特殊类型的唯一成员
区别:原始类型是最基本的数据类型,不可细分、更改;复杂类型通常是包含了对个原始类型的值的集合(容器)
犀牛书P33 对象类型(即复杂类型)可依据类划分为子类型:数组、函数、日期、正则、错误
typeof 和 instanceof
-
typeof
:检测操作数类型,返回值类型为字符串(any -> str) -
instanceof
:测试对象类,返回值类型为布尔值(obj,func -> str)
上述二者都能让我们知道一个值的数据类型,但不同的是,typeof
可以准确的返回原始值、函数、undefined的类型,对于其他对象类型的值,只会单一的返回 "object"
,无法精准判断;而 instanceof
专门针对对象类型的值,a instanceof A
,当a的类是A时(即a是A的实例),则返回true,否则返回false,详见犀牛书P78
判断变量类型
var a = 1,
b = 'nihao',
c = true,
d = function(){return 1;};
typeof a; // "number"
typeof b; // "string"
typeof c; // "boolean"
typeof d; // "function"
NaN
NaN:非数字值,它和任何值都不相等,包括自身。可以通过 x != x
来判断,当且仅当 x 为 NaN 时,返回 true,ES6中 Number 对象上新提供的 Number.isNaN()
也可检查一个值是否为 NaN
个人理解:非数字值在JS的归类中划入数字,只是这个值无法用数字表示,例如在类型转换中,
undefined
、"one"(非空,非数字)、
['a'](其他数组)、
function(){}`(任意函数),转换为数字时,结果都为 NaN,因为没办法找到一个数字来表示上述几种值,对象转换为数字的结果较为特殊,参考犀牛书P52
非数值转换为数值
// 显式转换
Number()
parseInt() // 注意参数个数
parseFloat()
// 隐式转换
+x // 加号有两个作用,作为数值运算符,转换为数字(优先级最大);作为加法运算符,相加(优先级次之)参考犀牛书P66 运算符列表
- -x // 有点多此一举,注意空格
==
与 ===
===
严格相等运算符
- 如果两值类型不同,则不相等
- 如果两个值都是
null
或者都是undefined
,则不相等 - 如果两个值都是布尔值
true
或者都是布尔值false
,则相等 - 如果其中一个值是 NaN,或者两个值都是 NaN,则不相等
- 如果两个值为数字且数值相等,则相等。如果一个值为0,另一个为-0,也相等
- 如果两个值为字符串,且所含的对应位上的16位数(犀牛书3.2节)完全相等,则他们相等。如果他们的长度或内容不同,则不等
- 如果两个引用值指向同一个对象、数组或函数,则他们相等。如果指向不同的对象,则不等,即使两个对象具有完全一样的属性
==
相等运算符
- 如果两个操作数类型相同,则参照上述全等运算的规则
- 如果两个操作数类型不同,应在转换类型之后再做比较
- 如果一个为
null
,另一个为undefined
,相等 - 如果一个是数字,另一个是字符串,先将字符串转为数字,再比较
- 如果其中一个值是true,则将其转换为1再进行比较。如果其中一个值是false,则将其转换为0再进行比较
- 如果一个值是对象,另一个值是数字或字符串,参照犀牛书3.8.3节,用valueOf和toString转换后再比较
- 其他不同类型之间的比较均不相等
- 如果一个为
break和continue
- break 用于强制退出循环体,执行循环后面的语句
- continue 用于退出本次循环,执行下次循环
void 0 和 undefined在使用场景上有什么区别
- undefined 并不是保留词,只是全局对象的一个属性,在低版本的IE中能被重写,在ES5中,其只是全局对象的一个只读属性,但在局部作用域中仍然可以被重写
(function(){ var undefined = 10; // 10 -- chrome alert(undefined); })(); (function(){ undefined = 10; // undefined -- chrome alert(undefined); })();
- void 运算符能对给定的表达式进行求值,然后返回 undefined。也就是说,void无论跟何种表达式,返回的都是 undefined。而最简便的就是 void 0。压缩代码时,常常用void 0代替undefined,因为void 是不能被重写的。
示例
console.log(1+1); // -> 2
console.log("2"+"4"); // -> "24"
console.log(2+"4"); // ->"24" 拓展 num->str时,常用 num+""
console.log(+"4"); // -> 4 此时加号作为数值运算符
var a = 1;
a+++a;
typeof a+2;
// 解析
/*
a+++a -> (a++)+a,a++为后增量,a的值自增1,但返回自增前到值,即a++,返回1,a为2
而typeof运算符优先级最高,要高于加法运算符,所以应理解为
*/
var a = 1;
a+++a; // (a++)+a; --> 1+2 --> 3 此时 a 为2
typeof a+2; // --> (typeof a)+2 --> (type 2)+2 --> "number"+2 --> "number2"
var a = 1;
var b = 3;
console.log( a+++b );
/*
同上,后增量 a+++b --> (a++)+b --> 1+3 --> 4
结果为4
拓展,++a+b
++a为前增量,a自增1,并且把自增后的值返回,
如果题目改成 console.log( ++a+b ),就相当于
(++a)+b --> 2+3 --> 5,结果便是5
*/
遍历数组,打印数组每一项的平方
var arr = [3, 4, 5];
var result = arr.map(function(x){console.log(x*x);});
遍历JSON,打印里面的值
var obj = {
name: 'hunger',
sex: 'male',
age: 28
};
for( var i in obj){
console.log("" + i + ":"+obj[i]);
}
选做
var a = 1, b = 2, c = 3;
var val = typeof a + b || c >0;
console.log(val) ;
// 结果为 "number2"
// var val = ((typeof a)+b) || (c>0);
// var val = "number2" || true;
// 返回 "number2"
或运算符,会首先计算第一个操作数的值,也就是会先计算左侧的表达式,如果结果为真值,那么返回这个真值。否则,再计算第二个操作数的值,即计算右侧的表达式,并返回这个表达式的计算结果
假值:undefined、null、0、-0、NaN、"" //空字符串,以上包括false都称为“假值”,在转换为布尔值时转为false,所有其他值,包括所有对象(数组)都会转换为true
var d = 5;
var data = d ==5 && console.log('bb');
console.log(data);
// 结果为 undefined
// 解析
// var data =((d == 5) && (console.log('bb')))
// var data =(true && (console.log('bb')))
// console.log('bb') 打印出字符串 'bb' 返回 undefined
// var data =(true && undefined)
// var data = undefined;
对与运算符(&&)应有三重理解
- 当操作数都是布尔值的时候,“&&” 对两个值执行布尔与(AND)操作,只有在第一个操作数和第二个操作数都为true时,返回true。如果其中一个为false,返回false
- “&&” 可以对真值和假值进行布尔与(AND)操作。如果两个操作数都是真值,那么返回一个真值;否则,至少一个操作数是假值的话,则返回一个假值
- 若左操作数为假值,只返回左操作数,不对右操作数进行计算;若左操作数为真值时,“&&” 运算符将计算右操作数并将其返回作为整个表达式的计算结果,
一言以蔽之,“左假返左,左真返右”
var data2 = d = 0 || console.log('haha');
console.log(data2);
// 或运算理解,左操作数为假值,右操作数为假值(console.log()返回 undefined),返回右操作数结果,即返回 undefined
// 因此只需返回右操作数,所以结果为 undefined
var x = !!"Hello" + (!"world", !!"from here!!");
console.log(x);
// 解析
// !!"Hello" -> true
// !"world" -> false
// !!"from here!!" -> true
// 逗号运算符是二元运算符,先计算左操作数,再计算右操作数,最后返回右操作数的值
// (!"world",!!"from here!!") -> (false,true) -> true
// !!"Hello" + true -> true + true -> 1+1 -> 2
// 此处的加号会让操作数先转换为数字,再进行计算,
// 所以结果为 2
“!” 运算符首先将其操作数转换为布尔值,然后再对布尔值求反。即 “!” 总是返回 true 或 false,并且,可以通过两侧逻辑非运算来得到一个值的等价布尔值:!!x
网友评论