问题:[]的valueOf和toString的结果是什么?
答案:[] 的 valueOf 结果为 [] ,toString 的结果为 ""
解析:valueOf 方法用于返回一个对象的原始值。当 JavaScript 需要将对象转换为原始值时(例如,使用加法运算符进行运算时),会自动调用该对象的 valueOf 方法。如果对象没有定义 valueOf 方法,则默认返回对象本身。
toString 方法用于将一个对象转换为字符串。当 JavaScript 需要将一个对象转换为字符串时(例如,使用模板字符串或字符串拼接时),会自动调用该对象的 toString 方法。如果对象没有定义 toString 方法,则默认返回 "[object Object]"。
两者的区别在于,valueOf 方法返回对象的原始值,而 toString 方法返回对象的字符串表示。如果对象同时定义了 valueOf 和 toString 方法,那么在将对象转换为原始值或字符串时,valueOf 方***优先于 toString 方法被调用。
问题:通常情况下,一个URL的格式是
答案:协议//主机:端口/路径名称?搜索条件
网络七层协议:7-应用层、6-表示层、5-会话层、4-传输层、3-网络层、2-数据链路层、1-物理层。
最新的 Chrome 浏览器包括:1 个浏览器(Browser)主进程、1 个 GPU 进程、1 个网络(NetWork)进程、多个渲染进程和多个插件进程。
问题:下面返回结果为true的有:
A isNaN(NaN)
B isNaN(10)
C isNaN('10')
D isNaN('blue')
答案:AC //isNaN()在接受一个值后之后,会尝试将这个值转换为数值。某些不是数值的值会直接转换为数值,例如字符串"10"或Boolean值。而任何不能被转换为数值的值都会导致这个函数返回true。
Object.prototype.toString.call() 使用 Object 对象的原型方法 toString ()来判断数据类型,最准确的一种数据判断类型
var a = Object.prototype.toString; console.log(a.call(2)); console.log(a.call(true)); console.log(a.call('str')); console.log(a.call([])); console.log(a.call(function(){})); console.log(a.call({})); console.log(a.call(undefined)); console.log(a.call(null)); //结果: [object Array]或者[Object Object]的字符串
经典面试题:如何让 (a == 1 && a == 2 && a == 3) 的值为true?
方法一: 每次调用的时候改变一次返回值,从而满足判断条件const a = { i: 1, toString: function () { return a.i++; } } if(a == 1 && a == 2 && a == 3) { console.log('Hello World!'); }
方法二: 劫持 js 的 getter 对象var val = 0; Object.defineProperty(window, 'a', { get: function() { return ++val; } }); if (a == 1 && a == 2 && a == 3) { console.log('yay'); }
判断空对象和空数组
1. 判断空对象
- 使用JSON自带的.stringify方法来判断:
if(Json.stringify(Obj) == '{}' ){ console.log('空对象'); }
- 使用ES6新增的方法Object.keys()来判断
if(Object.keys(Obj).length < 0){ console.log('空对象'); }
- 2.判断是否是数组
//使用Object.isArray const a = ['Hello','Howard']; const b = {0:'hello',1:'world'} Array.isArray(a);//true Array.isArray(b);//false //使用instanceof console.log(a instanceof Array);//true console.log(b instanceof Array);//false //使用construction,但是construction可以改写,如果在其他地方改写,则判断失败 console.log(a.constructor == Array);//true //用 Object 的 toString 方法判断:如果一个对象的toString方法没有被重写过的话,那么toString 方法将会返回”[object type]”,其中的type代表的是对象的类型,根据type的值,我们就可以判断这个 疑似数组的对象到底是不是数组了。 a.toString();//"Hello,Howard", b.toString() //[objct,object] //只有object对象能够正确返回类型,所以我们"借用"对象的 toString方法,使用call或者apply改变toString的执行上下文 Object.prototype.toString.call(a);//"[object Array]" //有Array.isArray是ES2015标准中增加的方法,部分比较老的浏览器可能会有兼容问题,所以为了增强健 壮性,建议还是给Array.isArray方法进行判断,增强兼容性,重新封装的方法如下: if (!Array.isArray) { Array.isArray = function(arg) { return Object.prototype.toString.call(arg) === '[object Array]'; };