牛客网 JS收集题

100 阅读3分钟

1. 以上 JavaScript 代码,在浏览器中运行的结果是

var foo = {n:1};
(function(foo){
    console.log(foo.n);
    foo.n = 3;
    var foo = {n:2};
    console.log(foo.n);
})(foo);
console.log(foo.n);

// 答案: 1 2 3

/**
解析:个人理解,错误勿喷
-   第一步:进行预编译,var全局变量foo、匿名函数 function、var局部变量foo
-   第二步:代码自上而下、自左向右执行计算:

1.  对全局变量foo进行赋值foo={n:1};注意:此值为对象,属于引用类型;
1.  匿名函数传入参数foo={n:1}自执行;
1.  console.log(foo.n);打出数字1;var foo 局部变量未赋值被忽略
1.  实参foo.n 被修改为了3,全局foo变量中n的值也为3;
1.  对局部变量foo进行赋值foo={n:2};
1.  console.log(foo.n);打出数字2;
1.  全局变量foo={n:3},因此,console.log(foo);打出数字3;
/

2. 假设val已经声明,可定义为任何值。则下面js代码有可能输出的结果为:

console.log('Value is ' + (val != '0') ? 'define' : 'undefine');

// 答案: define

//解析:加号优先级高于 三目运算。低于括号。 所以括号中无论真假 加上前边的字符串都为 TRUE 三目运算为TRUE是 输出 define

3. 执行以下程序,输出结果为

function fn(){ var a = b = 1; }
fn();
console.log(b);
console.log(a);

//答案: 1 抛出异常

//解析:b未声明为全局变量, fn函数内的局部变量a被在fn函数外访问,所以报错

4. 请问以下JS代码的执行结构是什么?

let obj = { num1: 117 };
let res = obj;
obj.child = obj = { num2: 935 } //(obj = {num1: 117}).child = {num2: 935}; obj = {num2: 935}
var x = y = res.child.num2; //res = {num1: 117, child: {num2: 935}}
console.log( obj.child ) //obj = { num2: 935}
console.log( res.num1 );
console.log( y, res );

//答案:undefined 117 935

5. 请问一下JS代码的执行结果是什么?

function control(x) {
  if( x === 3) throw new Error('break')
}

function foo(x = 6) {
  return {
    next: () => {
      control( x )
      return { done: !x, value: x && x-- } 
    }
  }
}

let x = new Object
x[Symbol.iterator] = foo

for(let i of x) console.log( i );

//6 5 4 报错

6. 执行以下程序,输出结果为?

function a(){
  console.log(this);
} 
a.call(null); //Window
a.call({});  //{}

7. 以下哪些表达式的结果为true

undefined == null //转换为Boolean类型 false == false. true

isNaN("100") //isNaN()底层调用了Number(). false

parseInt("1a") === 1 // number 1 === 1. true

[] instanceof Array //在原型链上. true

//答案:A C D

8. 判断对错

2.toString() // "."被看成了小数点 false
2..toString() // 2. === 2 true
3. eval('var c = 3')  //delete c 能够删除成功:在eval中使用var声明的全局变量可以被delete删除

9. 输入什么

var obj = {brand:``'华为'``,price:1999};

Object.defineProperty(obj,``'id'``,{value:1}) //defineProperty为对象设置属性后,该属性的描述符writable 是否可写、configurable是否可删除 以及enumberable 是否可枚举(是否可遍历)默认为false

Object.defineProperty(obj,``'price'``,{configurable:``false``})

console.log(Object.keys(obj).length); ...①

for (``var k ``in obj){

    ``console.log(obj[k]); ...②

}

obj.price = 999;

delete obj[``'price'``]

console.log(obj); ...③

Object.keys(obj)返回obj对象中自身可枚举属性组成的数组,虽然obj对象新增了id属性,但该属性是不可枚举的,故①式的输出结果为2,A选项错误;使用for...in...循环可以遍历对象可枚举的属性,id属性由于不可枚举,因此仍然不会被遍历到,②式的输出结果为华为 1999,B选项错误;price属性设置了configurable:false,表示该属性不可删除,删改无效,也不可再次修改其特性,但是属性值是可以重写的,因此③式输出结果为{brand: '华为', price: 999, id: 1},C选项正确,

10 以下哪些表达式的值为0?

A. (() => {}).length //形参的个数为0
B. 1 & 2 //按位与 0001 & 0010 同为1才为1
C. +[] //[].valueOf().toString() +'' //0
D. [1,2,-3].reduce((a,b) => a - b, 0)
//答案:ABCD
扩展:
+{} //NaN
+(() => {}) //NaN
+false //0

11. 问一份标准的HTML文档有哪几个必须的HTML标签?

<html>
<head>
<title>
<body>

答案:ABCD