浮点数精度转换
给下面几组例子,能输出60.75的是?
A.parseFloat('60.750');
B.Number('60.75hundsun');
C.parseFloat('60.750hundsun');
D. ...
我认为考察点在于parseFloat和Number对于处理字符串的区别
用法
parseFloat(string)
Number(value)
根据MDN解释:
如果参数字符串的第一个字符不能被解析成为数字,则
parseFloat返回NaN但是如果前面是数字,后面是非数字元素,前面的数字是可以被正常解析成浮点数的
输出
测试:
console.log(Number(undefined)); //NaN
console.log(Number(null)); //0
考虑使用
Number(value)进行更严谨的解析,只要参数带有无效字符就会被转换为NaN
题目测试:
console.log(parseFloat('60.750')); //60.75
console.log(parseFloat('60.750name')); //60.75
console.log(Number('60.750name')); //NaN
原型链
题目如下,看输出
function Aname(name) {
if (name) {
this.name = name;
}
}
Aname.prototype.name = '小红';
let name1 = new Aname();
function Bname(name) {
this.name = name;
}
Bname.prototype.name = '小绿';
let name2 = new Bname();
console.log(name1.name);
console.log(name2.name);
当时给我看迷惑了,区别就在于里面有没有if吗。。。这是考的啥
输出给我惊呆了。。。
分析
控制台里面打印一下输出:
如果只打印name1和name2的话,可以看到,name1是一个空对象,但name2中有一个name属性,name属性值为undefined
function Aname(name) {
if (name) {
this.name = name;
}
}
Aname.prototype.name = '小红';
let name1 = new Aname();
- 因为
let name1 = new Aname();时,new Aname()中内容为空,所以name1是一个空对象(也就代表了没有name传入) - Aname中有判断,是否有name,才进行对name属性的赋值操作
- 所以name1实例对象上没有name,也没有name值,而是顺着原型链往上找,看原型对象上有没有name属性
- 有
Aname.prototype.name = '小红';所以找到了,name1.name值便为小红 - 相当于,这里取到的name为原型对象上的name
再来看Bname
function Bname(name) {
this.name = name;
}
Bname.prototype.name = '小绿';
let name2 = new Bname();
因为Bname中没有判断,直接this.name = name;相当于直接给name2实例对象上创建了一个name属性,又因为new Bname()的时候里面为空,所以这个name属性的值为undefined
后面取name2.name的时候,直接就取到了最近的实例对象身上的name属性,name属性值为undefined,不会再找到原型链上的name了(也就是小绿)