记录js中一些常用类型值的tips
var a = [];
a['13'] = 11;
a.length; //14
如果字符串键值能被强制类型转换为十进制数字的话,它就会被当做数字索引来处理
js中字符串的值是不可变的,而数组是可变的(字符串不可变是指字符串的成员函数不会改变其原始值,而是会返回一个新的字符串。而数组的成员函数都是在其原始值上进行操作)
var a = '123';
var b = [1,2,3];
a[1] = 's';
b[1] = 's';
a;//123
b;//[1,'s',2]
字符串反转(因为字符串是不可变的,可以先把字符串转换为数组,然后调用数组的反转函数,最后再拼合起来)
var str = 'abc';
var res = str.split('').reverse().join('');
res; // 'cba'
NaN检测(NaN是JavaScript中唯一一个不等于自身的值)
if(Number.isNaN){//es6可以使用工具函数Number.isNaN()
Number.isNaN = function(n){
return n !== n;
}
}
值和引用
var a = 2;
var b = a; //b是a的值的一个副本
b++;
a; // 2
b; // 3
var c = [1,2,3];
var d = c; //d是[1,2,3]的一个引用
d.push(4);
c; // [1,2,3,4]
d; // [1,2,3,4]
简单值(基本类型值)总是通过值复制的方式来赋值/传递,包括null、undefined、字符串、数字、布尔和ES6中的symbol.
复合值--对象(包括数组和封装对象),和函数,则总是通过引用复制的方式来赋值\传递
var a = [1,2,3];
var b = a;
a; // [1,2,3]
b; // [1,2,3]
b = [4,5,6];
a; // [1,2,3]
b; // [4,5,6]
由于引用指向的是值的本身而非变量,所以一个引用无法修改另一个引用的指向(下面的例子能更好的说明)
function bar(x){
x.push(4);
x; // [1,2,3,4]
//然后
x = [4,5,6];
x.push(7);
x; // [4,5,6,7]
}
var a = [1,2,3];
bar(a);
a; // 是[1,2,3,4],而不是[4,5,6,7]
我们向函数传递a的时候,实际上是将引用a的一个复本赋值给x,而a任然指向[1,2,3]。在函数里面可以通过引用x来更改数组的值。但x = [4,5,6] 并不会影响a的指向,所以a仍然是指向[1,2,3,4]
我们如果想a的值变为[4,5,6,7],就必须更改x指向的数组,而不是为x赋值一个新的数组
x.length = 0; // 清空数组
x.push(4,5,6,7);
x; // [4,5,6,7]
//现在a的值也为[4,5,6,7]