js那些坑-1

1.数据类型

string,number,boolean,null,underfined,object,symbol(符号,es6新增)

typeof 数据,返回当前数据的数据类型,

typeof 'aa';        //返回"string"
typfof 11;          //返回"number"
typeof true;        //返回"boolean"
typeof undefined;   //返回"undefined"
typeof {};          //返回"object"
typeof null;        //返回object,这是个历史遗留问题,bug
typeof Symbol();    //返回"symbol"

if(typeof aa==='undefined){},会先进行typeof运算检查aa是否存在,aa不存在的情况下typeof aa返回undefined。

undefined和undeclared是两码事儿,undefined是的一种表现形式,undeclared表示变量没有被声明,会报错ReferenceError: a is not defined

2.数组
var a=[1,,2];
var b=[1,undefined,2]
console.log(a,b);//[1, empty, 2] , [1, undefined, 2]

a是稀疏数组,空值a[1]为undefined,但是和b[1]的值还是有区别的

var a=[];
a['name']='tom';
a.length;//0
a['5']='16';
a.length;//6

数组也是对象,包含键值对,也可以包含字符串的键值(key),但是字符串当key时,数组长度不变,如果是数字类的字符串,会将数字类字符串转化为数字,从而数组长度改变

var a="tom";
var b=['t','o','m'];
var c=Array.prototype.join.call(a,'-'); //t-o-m
var d=Array.prototype.map.call(a,function(v){
	return v.toUpperCase()+'.';
}).join('')			        //T.O.M.
var e=Array.prototype.reverse.call(a);  //Cannot assign to read only property '0' of object '[object String]'
//变通方法:将字符串转化为数组,数组中反转将数组转化为字符串
var f=a.split('').reverse().join('');  //mot

数组函数处理字符串很方便,虽然字符串没有这些函数,但是可以借用数组的非变更方法处理字符串,字符串的值是不可变的

3.数字
var a=1.5634;
a.toFixed(2);//1.56
11.toFixed(2); //Invalid or unexpected token
(11).toFixed(2); //11.00
11..toFixed(2); //11.00
1.13.toFixed(1); //1.1
tofixed表示小数点保留的位数,能直接在数字上用此方法,会当成数字常量的一部分

es6新增:0b(二进制),0o(八进制),es5:0x(十六进制)

01+0.2===0.3//false
二进制浮点数中0.1,0.2并不是很精确,结果是0.3比较接近的数字0.30000000000000004,
4.null,undefined,NAN

null:值空值(empty value),曾赋过值,但是目前没有值

undefined:没有值,(missing value),从未赋值

NAN:not a number,无效数值,失败数值,坏数值,var a=2/'b';

NAN!=NAN;//唯一一个不等于自身的,结果为true

Infinity:无穷数,有正负,js使用有限数字表示法运算结果可能溢出,此时结果为infinity或者-infinity,如果超出范围就近取整

var a=Number.MAX_VALUE;//1.7976931348623157e+308
a+a;//Infinity
a+Math.pow(2,970);//Infinity
a+Math.pow(2,969);//1.7976931348623157e+308
5.值和引用
var a=1;
var b=a;
b++;
a;//1
b;//2
var c={name:'tom'};
var d=c;
d['age']=18;
c;//{name: "tom", age: 18}
d;//{name: "tom", age: 18}
简单值:通过值复制的方式赋值或传递,包含:string,number,Boolean,null,undefined,symbol
复合值:通过引用复制的方式赋值或传递,包含:object(array,封装对象)

c,d分别指向统一复合值的不同引用,所以他们更改的是同一值,随后指向更改后的值

var a={name:'tom'};
var b=a;
a; //{name: "tom"}
b; //{name: "tom"}
b={name:'jerry'};
a; //{name: "tom"}
b; //{name: "jerry"}
由于引用指向的是值本身而非变量,所以一个引用无法更改另一个引用的指向,b={name:'jerry'}后,并不影响啊指向{name:'tom'}
function getObj(x){
	x['age']=18;
	console.log(x);//{name: "tom", age: 18}
	x={name:'jerry'};
	x['age']=20;
	console.log(x);//{name: "jerry", age: 20}
}
var o={name:'tom'};
getObj(o);
console.log(o);//{name: "tom", age: 18}

向函数传递o的时候,实际是将引用a的一个复本赋值给x,而a仍指向tom这个对象,但x=jerry并不影响a的指向,不能通过引用x改变引用a的指向,函数传递的是引用

多个对象是对同一object的引用,改变对象属性时,多个对象都改变;对某一对象重新赋值(=),改变的只是某一对象

赋值或参数传递是通过引用还是值复制完全由值类型传递。

js那些坑-2

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值