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.hasInstance | instanceof操作符内部实现的方法 |
Symbol.isConcatSpreadable | 布尔值,Array.prototype.concat()是否要讲集合参数摊平 |
Symbol.iterator | 返回iterator的方法 |
Symbol.match | String.prototype.match()用来比较字符串的方法 |
Symbol.replace | String.prototype.replace()用来替换字符串的方法 |
Symbol.search | String.prototype.search()用来滋味子字符串的方法 |
Symbol.species | 用来创建衍生对象(derived object)的构造函数 |
Symbol.split | String.prototype.split()用来切歌字符串的方法 |
Symbol.toPrimitive | 返回对象的原始值的方法 |
Symbol.toStringTag | Obejct.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){
小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数初中级前端工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年Web前端开发全套学习资料》送给大家,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频
如果你觉得这些内容对你有帮助,可以添加下面V无偿领取!(备注:前端)
总结
阿里十分注重你对源码的理解,对你所学,所用东西的理解,对项目的理解。
开源分享:【大厂前端面试题解析+核心总结学习笔记+真实项目实战+最新讲解视频】
,所用东西的理解,对项目的理解。