JavaScript(二)

1、下面代码的输出是什么?

+true;
!"Lydia";

该题主要考察的是数据类型转换,加运算会将true转换为数字1,如果是false会转为数字0。第二行的字符串“Lydia”进行布尔值转换的时候,会转换为true,但是!号是取反的意思,所以最后第二行代码的结果为false。该地答案为:1和false。

 

2、下面代码会输出什么?

let a = 3;
let b = new Number(3);
console.log(a == b);
console.log(a === b);

该题考察的是隐式类型转换,首先我们要知道,宽松相等(==)在进行比较的时候,会发生隐式类型转换,而严格相等(===)是不会的。这道题中,a是数字类型(number),b是一个对象,因为是通过new Number这个构造函数构造出来的。所以当a和b进行宽松相等的比较时,b会被隐式强制类型转换为数字类型3,所以输出true。当a和b进行严格相等的比较时,a和b的值虽然都是3,但是它们的数据类型是不一样的,所以会返回false。本题答案为:true和false。

3、下面代码的输出是什么?

let greeting;
greetign = {};    // typo
console.log(greetign);

这题考察了对未声明的变量进行赋值会发生什么样的操作,其实一个变量如果未进行声明就开始赋值的话,是会在全局作用域中创建一个新的对象,该对象为全局对象window的一个属性,可以参考《你不知道的JavaScript -- 上卷第一章》,当执行freetign = {}的时候,js引擎会为变量greetign进行LHS查询,沿着作用域一直查找到作用域最顶端都找不到的话,那么就会在全局作用域中创建一个具有该名称的变量,然后将其返回给js引擎;这一过程前提是在非严格模式下“use strict”。下一步就是将一个空对象赋值给greetign,之后输出的肯定也是一个空对象:{}。

4、当我们这样做时会发生什么?

function bark() {
  console.log("Woof!");
}

bark.animal = "dog";

在JavaScript中,除了基本数据类型:string、number、boolean、undefined、null、symbol,之外其它数据类型都可以称为对象,而对象就是可以拥有属性的。在这个例子当中,函数bark是一个对象,所以是可以为它添加一个属性animal的。所以该题的答案是一切正常(bark会成功地被新增一个属性animal)。

 

5、下面代码的输出是什么?

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());

这题考察的偏作用域更多吧,首先声明了一个Person构造函数,里面定义了两个属性;然后创建了一个对象member,值是Person构造函数的实例;接着给Person构造函数定义一个方法getFullName()。最后输出member.getFullName();  这里来分析一下,member这个对象是否拥有getFullName()方法,答案是否定的,因为getFullName不是在构造函数的原型上;如果需要访问到的话,可以这样写:

Person.prototype.getFullName = function() {
    return this.firstName + this.lastName
};

所以最后输出的是:TypeError(该异常错误来源于:RHS查询时找到了一个变量,但是对这个变量进行不合理的操作,如:不存在的属性和方法)。

今天就分享到这里,后面继续!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值