JS错题整理

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

var a={},
    b={key:'b'},
    c={key:'c'};

a[b]=123;	// a = {[object Object]: 123}
a[c]=456;	// a = {[object Object]: 456}

console.log(a[b]);
a[b] == a[c];

输出结果:456,true

解析:

设置对象属性时,JavaScript会隐式地将参数值串联起来。在这种情况下,由于b和c都是对象,它们都将被转换为“[object Object]”。因此,a [b]和a [c]都等价于[“[object Object]”],并且可以互换使用。因此,设置或引用[c]与设置或引用[b]完全相同。

a[b] == a[c];    //true

2、以下代码的输出是什么?

var length = 10;
function fn() {
    console.log(this.length);
}

var obj = {
  length: 5,
  method: function(fn) {
    fn();	//this=>window
    arguments[0]();	//this=>arguments
  }
};

obj.method(fn, 1);

输出结果:10,2

解析:

由于fn作为函数方法的参数传递,函数fn的作用域(this)是窗口。 var length = 10;在窗口级别声明。它也可以作为window.length或length或this.length来访问(当这个===窗口时)。

方法绑定到Object obj,obj.method用参数fn和1调用。虽然方法只接受一个参数,但调用它时已经传递了两个参数;第一个是函数回调,其他只是一个数字。

当在内部方法中调用fn()时,该函数在全局级别作为参数传递,this.length将有权访问在Object obj中定义的var length = 10(全局声明)而不是length = 5。

现在,我们知道我们可以使用arguments []数组访问JavaScript函数中的任意数量的参数。

因此arguments[0]只不过是调用fn()。在fn里面,这个函数的作用域成为参数数组,并且记录参数[]的长度将返回2。

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

(function () {
    try {
        throw new Error();
    } catch (x) {
        var x = 1, y = 2;	// x为当前作用域私有变量,y为上级作用域变量
        console.log(x);
    }
    console.log(x);
    console.log(y);
})();

输出结果:1,undefined,2

解析:上面代码等价于

(function () {
	var x,y;
    try {
        throw new Error();
    } catch (x) {
        x = 1;
        y = 2;
        console.log(x);
    }
    console.log(x);
    console.log(y);
})();

4、如何克隆一个对象?

var obj = {a: 1 ,b: 2}
var objclone = Object.assign({},obj);

请注意潜在的缺陷:Object.clone()只会执行浅拷贝,而不是深拷贝。这意味着嵌套的对象不会被复制。他们仍然引用与原始相同的嵌套对象:

let obj = {
    a: 1,
    b: 2,
    c: {
        age: 30
    }
};

var objclone = Object.assign({},obj);
console.log('objclone: ', objclone);

obj.c.age = 45;
console.log('After Change - obj: ', obj);           // 45 - This also changes
console.log('After Change - objclone: ', objclone); // 45

5、

console.log(1 < 2 < 3);
console.log(3 > 2 > 1);

输出结果:true,false

解析:

第一条语句返回true,如预期的那样。

第二个返回false是因为引擎如何针对<和>的操作符关联性工作。它比较从左到右,所以3> 2> 1 JavaScript翻译为true> 1. true具有值1,因此它比较1> 1,这是错误的。

5、

var b = [undefined];
b[2] = 1;
console.log(b);             // (3) [undefined, empty × 1, 1]
console.log(b.map(e => 7)); // (3) [7,         empty × 1, 7]

6、

console.log(typeof undefined == typeof NULL);	// true
console.log(typeof undefined == typeof null);	// false

7、

var b = 1;
function outer(){
       var b = 2
    function inner(){
    	// 变量提升var b;b为undefined
    	console.log(b);
        b++;	// NaN
        console.log(b);
        var b = 3;
        console.log(b);
    }
    inner();
}
outer();

输出结果:undefined,NaN,3

8、

console.log(document.parentNode);	// null
console.log(document.parentnode);	// undefined

undefined

1、变量提升,只声明未定义默认值就是undefined
2、严格模式下,没有明确的执行主体,this就是undefined
3、对象没有这个属性名,属性值是undefined
4、函数形参不传值,默认就是undefined

5、函数没有返回值(没有return或者return;),默认返回就是undefined

null

1、手动设置变量的值或者对象某一个属性值为null(此时不赋值,后边会赋值)
2、在JS的DOM元素获取中,如果没有获取到指定的元素对象,结果一般都是null
3、Object.prototype.__proto__的值也是null

4、正则捕获的时候如果没有捕获到结果,默认也是null

9、数组去重

~(function(){
	Array.prototype.myDistinct = function myDistinct(){
		var obj = {};
		for (var i = 0; i < this.length; i++) {
			var item = this[i];
			if (typeof obj[item] !== 'undefined') {
				this[i] = this[this.length-1];
				this.length--;
				i--;
				continue;
			}
			obj[item] = item;
		}
		obj = null;
		return this;
	}
})();

10、

console.log(parseInt('10*22'));  //10

11、

(new Promise(resolve=>{
	console.log(5);
	resolve(4);
	Promise(resolve=>{resolve(3)}).then(t=>{console.log(t);})
	console.log(1);
})).then(t=>{console.log(t);});
console.log(2);

输出结果:5,2,4(resolve后面代码不执行)

对比:

(new Promise(resolve=>{
	resolve(4);
	Promise.resolve().then(t=>{console.log(3);});
	console.log(1);
})).then(t=>{console.log(t);});
console.log(2);

输出结果:1,2,3,4

12、如下SQL语句中,____可能返回null值。

(1) select count(*) from t1;
(2) select max(col1) from t1;

(3) select concat('max=',max(col1)) from t1;

正确答案: D    你的答案: D (正确)
A (1)可能,(2)和(3)不可能
B (2)可能,(1)和(3)不可能
C (3)可能,(1)和(2)不可能
D (1)不可能,(2)和(3)可能
E 都不可能

F 都可能

13、

var reg1 = /^\w+\.\w+\-\w+\.\w+$/;        //false
var reg2 = /[w]{3}.[a-z\-]*.[a-z]/;        //true
var reg3 = /[c-w]{3,10}[.][c-w][.][a]/;        //false
var reg4=/^\w.*com$/;        //true
var str = 'www.dji.com';
console.log(reg1.test(str),reg2.test(str),reg3.test(str),reg4.test(str));

输出结果:fasle,true,false,true

14、

var a={
        name:1,
        b:function(){
                this.name++;
                return this.name;
        }
}
console.log(a.b());
var c=a.b;
console.log(c());

输出结果:2,1

15、

var i=2;
var x=(i++)+(i++)+(i++);
x;

输出结果:9(2+3+4)

拓展:

var i=2;
var x=(i++)+(i++)+(i++)+(i++);
x;
输出:14(2+3+4+5)

猜你喜欢

转载自blog.csdn.net/u011435776/article/details/80910184
今日推荐