js那些坑-2

1.原生函数(native function)

常用原生函数有:String(),Number(),Boolean(),Array(),Object(),Function(),RegExp(),Date(),Error(),Symbol().

内部属性[[class]]:typeof返回object的对象都有一个内部属性,这个属性无法直接访问,可以通过Object.prototype.toString()查看

Object.prototype.toString.call([1,2,3]);//"[object Array]"
Object.prototype.toString.call({});//"[object Object]"
//基本类型值被各自的封装对象自动包装
Object.prototype.toString.call(1);//"[object Number]"
Object.prototype.toString.call('1');//"[object String]"
Object.prototype.toString.call(true);//"[object Boolean]"
//Null(),Undefined()这样的原生构造函数并不存在,但是内部[[class]]属性仍为Null,Undefined
Object.prototype.toString.call(null);//"[object Null]"
Object.prototype.toString.call(undefined);//"[object Undefined]"

js引擎自己决定何时该使用封装对象,优先使用'abc',123,true这种基本类型值,不使用封装对象new String(),new Number(),new Boolean().

对封装对象进行拆封(转化为基本类型),可以使用valueOf()

var a=new String('abc');//String {"abc"}
var b=a.valueOf();//"abc"

Object(),Function(),RegExp()一般不建议使用,建议使用var a={},function a(){},var a=/^a/g;这种变量声明的方式
Date(),创建日期对象,可以通过日期对象的getTime(),获取当前的unix时间戳
Error(),创建错误对象,为了获取当前运行栈的上下文(函数调用栈信息和产生错误的代码行号,以便调试)
Symbol(),符号是具有唯一性的特殊值,不能带new关键字,var s=Symbol('name');//s:Symbol(name)

2.强制类型转化

1.显示转化为字符串,toString():普通对象的toString()(Object.prototype.toString()),返回内部属性[[class]]的值,如果自定义返回自定义的值

var a=1;
var b='2';
var c=String(a);//"1"
var d=Number(b);//2
var e=a.toString();//toString是显示的,但是不适合基本类型值,会自动创建一个封装对象,然后对象调用toString()
var f=+b;//隐式转化为数字
var g=a+b;//"12",有字符串类型是拼接

符号的强制类型转化:

var a=Symbol('haha');
String(a);//"Symbol('haha')"
var b=Symbol('hehe');
b+"";//typeError

json字符串化:JSON.stringify(1);安全的JSON值不包含undefined,function,symbol和包含循环引用的对象,如果对象中遇到这些值,会自动忽略,在数组中返回null

JSON.stringify(undefined);//undefined
JSON.stringify(function(){});//undefined
JSON.stringify([1,undefined,function(){},4]);//"[1,null,null,4]"
JSON.stringify({a:2,b:function(){}});//"{"a":2}"
var o={};
var a={b:2,c:o,d:function(){}}
o.e=a;
JSON.stringify(a);//循环引用,会报错,Uncaught TypeError: Converting circular structure to JSON
a.toJSON=function(){
    return {b:this.b}
}
JSON.stringify(a);//"{"b":2}",对象中定义了toJSON()方法,执行JSON.stringify()方法时,首先调用toJSON方法,然后用他的返回值进行序列化

JSON.stringify(obj,replacer,space)
replace如果为数组,指定序列化的属性,如果为函数,他会对对象本身调用一次,然后对象中每个属性调用一次,每次传递key,value如果要忽略某个键返回undefined,否知返回指定的值。

space指定输出的格式,如果为数组指定空格数,也可以是字符串如:'^^'

2.toNumber,转化为数字

true->1,false->0,undefined->NaN,null->0

对象会转化为基本类型值,为了将值转化为基本类型值,首先会进行valueOf(),返回基本类型值;如果没有此方法使用toString()的返回值进行轻质类型转换,对字符串的处理基本遵循数字常量的相关规则

Number('1');//1
Number([]);//0
Number('');//0
Number(null);//0
Number(false);//0
Number('a');//NaN
Number(undefined);//NaN
Number([1,2,3]);//NaN
Number({'a':1});//NaN
//显示解析数字字符串,parseInt()解析允许有非数字字符,参数必须是字符串,Number()转化不允许有
var a="20";
var b="20px";
Number(a);//20
Number(b);//NaN
parseInt(a);//20
parseInt(b);//20

3.toBoolean,转化为布尔值

假值:被强制转化为false,包含:false,0,-0,NAN,""(空字符串),null,undefined

正值:假值列表外的

(1)显示转化为布尔值,!显示的将值转化为布尔值,同时将真值反转为假值(或假值转真值),显示转化布尔值常用2个!,第二个!将结果反转回原值,if()中没有使用Boolean()或!!,会自动进行隐式转化

var a='0';
var b={};
var c=0;
var d=null;
var e;
Boolean(a);//true
Boolean(b);//true
Boolean(c);//false
Boolean(d);//false
Boolean(e);//false
!!a;//true
!!e;//false

(2)隐式转化为布尔值

a.if()语句中条件判断表达式
b.for(;;)语句中条件判断表达式(第二个)
c.while()和do..while()循环中的条件判断表达式
d.三元表达式?:中条件判断表达式
e.逻辑运算符||,&&左边的操作数,逻辑运算符返回其中一个操作数

4.日期转化为数字

var now=+new Date();//隐式转化为数字
var b=new Date().getTime();//显示转化为数字
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值