面试题(1)之 杂七杂八

1、变量声明的作用域

function fn () {
    var a = b = c = 1;
}
// var a = b = c = 1; => var a = ( b = ( c = 1 ));

// b,c是全局变量
// 赋值是从右往左进行的,也就是说这一行先执行b=1
// 这时候b就是全局变量了,没有被var过。
// 然后是var a = b;
(function () {
        var  a  =  b  =  1;
})();
console.log("a defined? "  +  (typeof  a  !==  'undefined'));
console.log("b defined? "  +  (typeof  b  !==  'undefined'));

分析:a 和 b 都定义在自调用函数中,并且都是通过var关键字创建,

对于sj初学者来说,a 和 b 在函数内部,属于局部变量,所以 a 和 b 的数据类型为undefined。

这是因为初学者把var a = b = 1 ,错误的理解为以下语句:

var a = 1;
var b = 1;

很显然,这是错误的!实际还是哪个程序执行是自右向左的,实际解析情况如下:

b = 1; // var声明的是局部变量,若是不带var,变量默认是全局的。
var a = b;

因此(不在严格模式下),此段代码输出结果为:

a defined? false
b defined? true

2、arguments 对象

function test(x, y, z) {  
  alert(test.length);
  alert(arguments.length);
  alert(arguments.callee === test);
  alert(arguments[2]);
}
test(10, 20); // 3 2 true undefined

[JavaScript 之 arguments 对象](https://www.cnblogs.com/houfee/p/10911976.html)

3、变量提升 和 函数名优先原则

var x = 30;
function test() {
  alert(x);
  var x = 10;
  alert(x);
  x = 20;
  function x() { };
  alert(x);
}
test(); // function x(){...} 10 20
// 进入函数作用域以后,函数声明 和 变量声明提升,而且函数名优先

4、对象的隐式转换

"5" + {
    toString: function(){return this;},
    valueOf: function(){return "valueOf";}
 }
// "5valueOf"

“+” 此时是做为链接符号存在的。

ECMAScript262中规定,首先对"+"前后的两个表达式进行求值,即调用valueof方法。

再调用 typeof 对他们的类型进行判断,如果有一个类型为 string 的则都将转化为string。

不为 string 类型,调用 toString 方法。

所以后面的 对象 会被转化为string类型。

5、事件冒泡 和 阻止默认事件

使用event.stopPropagation()起到阻止捕获和冒泡阶段中当前事件的进一步传播。

使用event.preventDefault()可以取消默认事件。

6、列举几个常用的事件对象属性

  • ev.type 获取当前事件名

  • ev.target 获取事件目标最最先触发事件的元素

鼠标事件对象:

  • 事件对象.clientX / 事件对象.clientY

  鼠标在浏览器可视区域中的坐标

  • 事件对象.offsetX / 事件对象.offsetY

  获取鼠标在指定的元素的区域中的坐标

  • 事件对象.pageX / 事件对象.pageY

  获取鼠标在整个文档区域中的坐标

键盘事件对象的属性:

  • 事件对象.altKey

  检测是否按下键盘上的 Alt键。 按下返回 true

  • 事件对象.ctrlKey

  检测是否按下键盘上的 Ctrl键。 按下返回 true

  • 事件对象.shiftKey

  检测是否按下键盘上的 Shift键。 按下返回 true

  • 事件对象.keyCode

  返回被敲击的键生成的 Unicode 字符码(ascii码),返回ascii码表对应的十进制的数字

7、获取本月天数

let date = new Date()
let year = date.getFullYear()
let month = date.getMonth() + 1
let d = new Date(year, month, 0)
console.log(d.getDate())
原文地址:https://www.cnblogs.com/houfee/p/10419326.html