一)请写出下面打印出来的值:
console.log(+true)
//1
console.log(!"")
//true
console.log(!"ss")
// false
console.log("" == false)
// true
console.log('ss' == true)
// false
console.log(!!null);
//false
console.log(!!"")
//false
console.log(!!1)
//true
[] === [] //false
undefined === undefined //true
[] == [] //false
undefined == undefined //true
二)
let a = 3; let b = new Number(3); console.log(a == b); console.log(a === b); 答案是:true false new Number()是一个内置的函数构造函数。 虽然它看起来像一个数字,但它并不是一个真正的数字:它有一堆额外的功能,是一个对象。ps:==会引发隐式类型转换,右侧的对象类型会自动拆箱为Number类型。
三) class Chameleon { static colorChange(newColor) { this.newColor = newColor; } constructor({ newColor = "green" } = {}) { this.newColor = newColor; } } const freddie = new Chameleon({ newColor: "purple" }); freddie.colorChange("orange"); 答案分析:colorChange方法是静态的。 静态方法仅在创建它们的构造函数中存在,并且不能传递给任何子级。 由于freddie是一个子级对象,函数不会传递,所以在freddie实例上不存在freddie方法:抛出TypeError。
四) function bark() { console.log("Woof!"); } bark.animal = "dog"; //dog 这在JavaScript中是可能的,因为函数也是对象!(原始类型之外的所有东西都是对象) 函数是一种特殊类型的对象。您自己编写的代码并不是实际的函数。 该函数是具有属性的对象,此属性是可调用的。
function Person(firstName, lastName) {
this.firstName = firstName;
this.lastName = lastName;
}
const member = new Person("Lydia", "Hallie");
Person.getFullName = () => this.firstName + this.lastName;
console.log(member.getFullName());
//TypeError
您不能像使用常规对象那样向构造函数添加属性。 如果要一次向所有对象添加功能,则必须使用原型。 所以在这种情况下应该这样写:
Person.prototype.getFullName = function () {
return `${this.firstName} ${this.lastName}`;
}
五) function getPersonInfo(one, two, three) { console.log(one); console.log(two); console.log(three); } const person = "Lydia"; const age = 21; getPersonInfo`${person} is ${age} years old`; //["", "is", "years old"] Lydia 21 如果使用标记的模板字符串,则第一个参数的值始终是字符串值的数组。 其余参数获取传递到模板字符串中的表达式的值!
六) function getAge(...args) { console.log(typeof args); } getAge(21); //object 扩展运算符(... args)返回一个带参数的数组。 数组是一个对象,因此typeof args返回object。
以上内容参考公众号:前端食堂的【再送你43道JavaScript面试题】