2024年最全javaScript(十七)类型进阶(1),2024年最新面试缺点最佳答案

最后

前15.PNG

前16.PNG

由于文档内容过多,为了避免影响到大家的阅读体验,在此只以截图展示部分内容

开源分享:【大厂前端面试题解析+核心总结学习笔记+真实项目实战+最新讲解视频】

对象类型转字符串

三种方法:value.toString(),String(value),‘’+value

console.log({x:1}.toString()) //[object Object]

console.log(‘’+{x:1}) //[object Object]

console.log(String({x:1})) //[object Object]

对象类型转数值

有两种:+varlue,Number(value)

var oa={x:1};

console.log(+oa) //NaN

console.log(Number(oa)) //NaN

类型识别

  • 可以使用typeof value检测

  • 也可以使用obj instanceof constructor,注意instanceof不是在获得变量的类型,而是在判断变量的类型是否与给定的相一致,不可以跨frame

var ob=new Date();

var oc=[];

var od=null;

var oe=/\d+/

console.log(ob instanceof Date) //true

console.log(oc instanceof Array) //true

console.log(od instanceof Object) //false

console.log(oe instanceof RegExp) //true

甚至自定义的构造函数也可以判断,

  • **constructor,**检测变量的构造函数,不可以跨frame

console.log(({x:1}).constructor.name) //Object

console.log(([]).constructor.name) //Array

console.log((new Date()).constructor.name) //Date

console.log((‘’).constructor.name) //String

console.log((true).constructor.name) //Boolean

console.log((123).constructor.name) //Number

console.log((null).constructor.name) //TypeError,没有constructor属性,会报错

console.log((undefined).constructor.name) //TypeError,没有constructor属性,会报错

  • Object.prototype.toString**(推荐)**,检测对象的内部属性

function getType(o) {

var toString=Object.p

return Object.prototype.toString.call(o);

}

var pa=new Date();

var pb=[]

var pc=/\d+/;

console.log(getType(pa)) //[object Date]

console.log(getType(pb)) //[object Array]

console.log(getType(pc)) //[object RegExp]

方法小结
typeof无法检测具体的对象类型,适合检测变量是否有定义
instanceof无法检测原始类型,跨frame失效
constructor不检查原型链,无法检测null和undefined,跨frame失效,有浏览器兼容问题,某些场景下无效
duck-typing不可靠,某些场景下失效
Object.prototype.toString可以检测所有原生对象,无法识别自定义对象的具体类型

最最最推荐的,是优先使用原生方法

实际开发中最常用的是检测数组,Array.isArray()

模版字面量(不会,下次在弄懂)

  • 模版字面量是允许嵌入表达式的字符串字面量,可以使用多行字符串和字符串插值功能。

  • 支持所有合法的JavaScript表达式,包括函数调用

  • 插值表达式支持嵌套

Symbol

详细请看:https://www.cnblogs.com/ddfe/p/5609733.html

一种新的原始数据类型,表示独一无二的值。它是JavaScript语言的第七种数据类型,表示独一无二的值

想给他人创建的对象添加属性,不管该属性取什么名字,理论上都有存在冲突的可能性,而使用Symbol作为对象的属性名就没有这个顾虑,因为它的值是唯一的,这也意味着给对象添加私有属性成为了可能

  • 注意:Symbol()是原始类型,不是对象,构造函数,所以不存在new这个关键字

  • 注意:Symbol值作为对象属性名时,不能用点运算符,因为点运算符后面总是字符串

let name=Symbol();

let person={};

person[name]=“casd”

console.log(person[name]);

console.log(name)

有时候需要在不同的地方使用同一个symbol,用来当作不同对象的唯一标识符,可以使用**Symbol.for()**方法完成这个功能

var uid=Symbol.for(‘uid’);

var object={

[uid]:“1234”

}

console.log(object[uid]) //1234

console.log(uid); //Symbol[uid]

var uid2 = Symbol.for(“uid”);

console.log(uid === uid2); //true

console.log(object[uid2]); //1234

console.log(uid2); //Symbol[uid]

可以使用Obejct.getOwnPropertySymbols()方法查找对象的symbol属性

var uid=Symbol.for(‘uid’);

var object={

[uid]:“1234”

}

var symbols=Object.getOwnPropertySymbols(object);

console.log(symbols.length); //1

console.log(symbols[0]); //Symbol(uid)

console.log(object[symbols[0]]); //1234

es6内置symbol

名称作用
Symbol.hasInstanceinstanceof操作符内部实现的方法
Symbol.isConcatSpreadable布尔值,Array.prototype.concat()是否要讲集合参数摊平
Symbol.iterator返回iterator的方法
Symbol.matchString.prototype.match()用来比较字符串的方法
Symbol.replaceString.prototype.replace()用来替换字符串的方法
Symbol.searchString.prototype.search()用来滋味子字符串的方法
Symbol.species用来创建衍生对象(derived object)的构造函数
Symbol.splitString.prototype.split()用来切歌字符串的方法
Symbol.toPrimitive返回对象的原始值的方法
Symbol.toStringTagObejct.prototype.toString()创建对象时的描述字符串
Symbol.unscopables一个对象,指定在使用with语句时,不应遍历的属性名称集合

Symbol.hasInstance

用来判断给的的对象是否是该函数的实例,它是函数原型上的方法

let a=12;

console.log(a instanceof Number)   //false

console.log(Number[Symbol.hasInstance](a));   //false

Symbol.hasInstance是不能被修改不能被枚举的,所以如果要修改,要使用definProperty方法

Object.defineProperty(Number,Symbol.hasInstance,{

value:function(n){

return typeof n === “number”

}

})

Symbol.isConcatSpreadable

concat()方法用于合并两个或多个数组,默认数组元素是展开的,它的值是undefined,如果不想展开,就将它的值设为false

var a=[‘a’,‘b’];

var n=[1,2];

console.log(a.concat(n,‘123asd’)); //[“a”,‘b’,1,2,‘123asd’],5个元素

console.log(a[Symbol.isConcatSpreadable])

n[Symbol.isConcatSpreadable]=false;

console.log(a.concat(n,3))//[“a”,‘b’,[1,2],‘123asd’],4个元素

另外对类数组也适用,合并是会根据length的值,查找obj[0]到obj[length-1]的值进行合并,所以必须包含0到length-1的数值属性

最后

前15.PNG

前16.PNG

由于文档内容过多,为了避免影响到大家的阅读体验,在此只以截图展示部分内容

开源分享:【大厂前端面试题解析+核心总结学习笔记+真实项目实战+最新讲解视频】

cat(n,3))//[“a”,‘b’,[1,2],‘123asd’],4个元素

另外对类数组也适用,合并是会根据length的值,查找obj[0]到obj[length-1]的值进行合并,所以必须包含0到length-1的数值属性

最后

[外链图片转存中…(img-iVGpe0i2-1715646550188)]

[外链图片转存中…(img-2zuX3XNe-1715646550189)]

由于文档内容过多,为了避免影响到大家的阅读体验,在此只以截图展示部分内容

开源分享:【大厂前端面试题解析+核心总结学习笔记+真实项目实战+最新讲解视频】

  • 26
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值