JavaScript易错点(长期更新)
下面输出的是什么
function F (){};
F.prototype = null;
var o1 = new F();
console.log(F.prototype);
console.log(o1.__proto__);
var o2 = Object.create(null);
console.log(o2.__proto__);
答案:
null object undefined
点评:
new
的时候,如果构造函数的原型是是object类型那么浏览器会添加o1.__proto__ = F.prototype
否则会添加o1.__proto__ = Object.prototype
下面输出的是什么
(function (){
let a = this ? class b{} :class c{};
console.log(typeof a,typeof b, typeof c);
})();
答案:
function undefined undefined
点评: class和function处于等式右边的时候不会向外暴露类名和函数名
下面输出的是什么
var arr1 = "john".split('');
var arr2 = arr1.reverse();
var arr3 = "jones".split('');
arr2.push(arr3);
console.log("array 1: length=" + arr1.length + " last=" + arr1.slice(-1));
console.log("array 2: length=" + arr2.length + " last=" + arr2.slice(-1));
答案:
array 1: length=5 last=j,o,n,e,s array 2: length=5 last=j,o,n,e,s
点评: reverse会改变原数组,所以arr1和arr2其实是一个数组
下面输出的是什么
var a = {}, b = {key:'b'},c = {key:'c'};
a[b] = 123;
a[c] = 456;
console.log(a[b]);
答案:
456
点评:
[]
访问属性的时候对于对象会调用toString
方法,b和c的toString
的结果都是[object Object]
下面输出的是什么
var a = {n:1};
var b = a;
a.x = a = {n:2};
console.log(a.x);
console.log(b.x);
答案:
undefined {n: 2}
点评: 执行第三行那个等式的时候,a.x先进入栈,此时a和b应该是一样的。之后后面那个等式进栈并执行,后面的结果把a改了,也就是a变成{n:2}了,返回的结果也是{n:2}。此时前面的a.x的地址就是b.x的地址,所以b.x = {n:2}。
下面输出的是什么
console.log(Number());
console.log(Number(undefined));
console.log(Number(null));
console.log(Number("012"));
console.log(Number("abc"));
console.log(Number({valueOf:()=>123}));
console.log(Number({toString:()=>456}));
console.log(Number({valueOf:()=>123,toString:()=>456}));
答案:
0 NaN 0 12 NaN 123 456 123
点评: Number转换的时候不传值和传入null的时候是0;如果是undefined的时候然后的是NaN;字符串会忽略前置的0(而不是8进制);不以数字开头的是NaN;对象会调用valueOf()方法,如果结果用Number转化后还是NaN,那么就会用toString()的结果再转换一次。
下面输出的是什么
console.log(parseFloat("0xA"));
console.log(parseInt("0xA"));
console.log(parseInt("012"));
答案:
0 10 12
点评: parseFloat对于16进制的都换转化为0,parseInt对0开头的都会忽略(ES3的时候是按照8进制转换的)。
下面输出的是什么
console.log(Number.POSITIVE_INFINITY + Number.POSITIVE_INFINITY);
console.log(Number.POSITIVE_INFINITY + Number.NEGATIVE_INFINITY);
console.log(Number.NEGATIVE_INFINITY + Number.NEGATIVE_INFINITY);
console.log(1 + NaN);
答案:
Infinity NaN -Infinity NaN
点评: 正无穷加正无穷等于正无穷,负无穷加负无穷等于负无穷,正无穷加负无穷不是个数,不是个数加其他数任然不是个数。
下面输出的是什么
console.log(NaN < 0);
console.log(NaN = 0);
console.log(NaN > 0);
答案:
false false false
点评: NaN和任何数字比较都是false。
下面输出的是什么
var d = (a = 1,b = 2,c = 3);
console.log(d);
答案:
3
点评: 逗号表达式返回最后一个。
下面输出的是什么
console.log(123 instanceof Number);
答案:
false
点评: 123的数据类型是number而不是object,所有不是对象的数据类型使用instanceof都返回false。
下面输出的是什么
console.log(new Array(3,2,1));
console.log(new Array(3));
答案:
[3, 2, 1] [undefined, undefined, undefined]
点评: new Array的时候多个参数的时候会认为是数组的内容,一个参数的时候会认为是数组的长度。
下面输出的是什么
function F1 (){
return 123;
}
function F2 (){
return {name:"不告诉你"};
}
function F3 (){
return this;
}
console.log(new F1());
console.log(new F2());
console.log(new F3());
答案:
F1 {} {name: “不告诉你”} F3 {}
点评: new的时候如果构造方法返回的是一个对象,那么new的结果就是这个对象,否则创建一个对象,新创建的对象的原型指向构造方法的原型。
下面输出的是什么
function fn (){
try{
return 0;
throw new Error("我就要抛出错误");
} catch (e){
return 1;
} finally {
return 2;
}
}
console.log(fn());
答案:
2
点评: finally一定会执行,即使有return也阻止不了。
- 一个简单的MySQL数据迁移示例
- MySQL访问受限的问题分析
- 一个Oracle监听问题的网络排查
- MySQL InnoDB Cluster环境搭建和简单测试
- 多平台下的数据存储新秀-PROTOBUF
- TCP的长连接与短连接的含义与区别(附Java代码实现)
- Mycat读写分离配置实践
- 快速搭建主从的脚本和问题排查
- MySQL在RR隔离级别下的unique失效和死锁模拟
- Golang语言--glog日志库使用
- 一个MySQL死锁问题的复现
- Spring Boot 2.0 新特性(一):配置绑定 2.0 全解析
- MySQL断电恢复的一点简单分析
- Spring Boot 2.0 新特性(二):新增事件ApplicationStartedEvent
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Python 基础(二):基本语句
- javaScript代码飘红报错看不懂?读完这篇文章再试试!
- Synchronized简述
- PythonforResearch | 2_数据处理
- 程序员过关斩将--Http请求中如何保持状态?
- 如何有效恢复误删的HDFS文件
- 别再用OFFSET和LIMIT分页了
- 别再用大小比较时间了
- Redis快速入门
- 捉虫记:Unexpected end of JSON input while parsing
- 重新思考日志:业务系统竟然是一个大数据库?
- 测试面试题集-Linux常用命令
- 「真香警告」鱼头手摸手教你在小程序里用composition-api
- 【技术文】SSL握手中的几个密码
- 分布式监控系统SkyWalking