JavaScript前端面试题

Javascript面试应该注意的点

2018-11-21  本文已影响1人  Aniugel

NaN(Not a Number,非数)是计算机科学中数值数据类型的一类值,表示未定义或不可表示的值。

基本数据类型:字符串(String)、数字(Number)、布尔(Boolean)、对空(Null)、未定义(Undefined)、Symbol。6类
引用数据类型:对象(Object)、数组(Array)、函数(Function)。3类
注:Symbol 是 ES6 引入了一种新的原始数据类型,表示独一无二的值。

JavaScript 变量的生命期从它们被声明的时间开始。

局部变量会在函数运行以后被删除。
全局变量会在页面关闭后被删除。

向未声明的 JavaScript 变量分配值

如果您把值赋给尚未声明的变量,该变量将被自动作为 window 的一个属性。
这条语句:
carname="Volvo";
将声明 window 的一个属性 carname。

非严格模式下给未声明变量赋值创建的全局变量,是全局对象的可配置属性,可以删除。
var var1 = 1; // 不可配置全局属性
var2 = 2; // 没有使用 var 声明,可配置全局属性
console.log(this.var1); // 1
console.log(window.var1); // 1
delete var1; // false 无法删除
console.log(var1); //1
delete var2;
console.log(delete var2); // true
console.log(var2); // 已经删除 报错变量未定义

如果在文档已完成加载后执行 document.write,整个 HTML 页面将被覆盖。
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>菜鸟教程(runoob.com)</title>
</head>
<body>
<h1>我的第一个 Web 页面</h1>
<p>我的第一个段落。</p>
<button onclick="myFunction()">点我</button>
<script>
function myFunction()
{
    document.write(Date());
}
</script>
</body>
</html>

在 HTML 中, 全局变量是 window 对象: 所有数据变量都属于 window 对象。
你的全局变量,或者函数,可以覆盖 window 对象的变量或者函数。
局部变量,包括 window 对象可以覆盖全局变量和函数。
在 JavaScript 中, 对象和函数同样也是变量。全局和局部变量即便名称相同,它们也是两个不同的变量。修改其中一个,不会影响另一个的值

事件委托是: 利用事件冒泡的原理,让自己的所触发的事件,让他的父元素代替执行!
闭包是什么,有什么特性,对页面有什么影响
闭包就是能够读取其他函数内部变量的函数,使得函数不被GC回收,如果过多使用闭包,容易导致内存泄露
变量提升:函数声明和变量声明总是会被解释器悄悄地被"提升"到方法体的最顶部。
JavaScript 只有声明的变量会提升,初始化的不会。
JavaScript 严格模式(strict mode)不允许使用未声明的变量。在函数内部声明是局部作用域 (只在函数内使用严格模式):消除Javascript语法的一些不合理、不严谨之处,减少一些怪异行为;
对象也是一个变量。不允许删除变量或对象。不允许删除函数。不允许变量重名:不允许变量重名:不允许使用八进制:不允许使用转义字符:不允许对只读属性赋值:

"use strict";
x = {p1:10, p2:20};      // 报错 (x 未定义)
"use strict";
var x = 3.14;
delete x;  
"use strict";
function x(p1, p2) {}; 
delete x;                // 报错 
"use strict";
function x(p1, p1) {};   // 报错
JavaScript 中的所有数据都是以 64 位浮点型数据(float) 来存储。所有的编程语言,包括 JavaScript,对浮点型数据的精确度都很难确定:
var x = 0.1;
var y = 0.2;
var z = x + y;//0.30000000000000004

在 JavaScript 中,分号是可选的 。由于 return 是一个完整的语句,所以 JavaScript 将关闭 return 语句。| 注意:不用对 return 语句进行断行。 |

function myFunction(a) {
    var
    power = 10;  
    return
    a * power;
}
//两者是一致的
function myFunction(a) {
    var
    power = 10;  
    return;       // 分号结束,返回 undefined
    a * 

在 JavaScript 中, 对象 使用 名字作为索引。如果你使用名字作为索引,当访问数组时,JavaScript 会把数组重新定义为标准对象。执行这样操作后,数组的方法及属性将不能再使用,否则会产生错误:
循环作用域,在第一个实例中,使用了 var 关键字,它声明的变量是全局的,包括循环体内与循环体外。在第二个实例中,使用 let 关键字, 它声明的变量作用域只在循环体内,循环体外的变量不受影响

var i = 5;
for (var i = 0; i < 10; i++) {
    // 一些代码...
}
// 这里输出 i 为 10
let i = 5;
for (let i = 0; i < 10; i++) {
    // 一些代码...
}
// 这里输出 i 为 5

使用 let 关键字声明的全局作用域变量不属于 window 对象:不能使用 window.carName 访问变量。
使用 var 关键字声明的变量在任何地方都可以修改

var x = 2;
// x 为 2
var x = 3;
// 现在 x 为 3

在相同的作用域或块级作用域中,不能使用 let 关键字来重置 var 关键字声明的变量

var x = 2;       // 合法
let x = 3;       // 不合法
{
    var x = 4;   // 合法
    let x = 5   // 不合法
}

const 用于声明一个或多个常量,声明时必须进行初始化,且初始化后值不可再修改:
// 错误写法
const PI;
PI = 3.14159265359;
// 正确写法
const PI = 3.14159265359;

const 的本质: const 定义的变量并非常量,并非不可变,它定义了一个常量引用一个值。使用 const 定义的对象或者数组,其实是可变的。下面的代码并不会报错:
// 创建常量对象
const car = {type:"Fiat", model:"500", color:"white"};
// 修改属性:
car.color = "red";
// 添加属性
car.owner = "Johnson";
void 该操作符指定要计算一个表达式但是不返回值;可以做死锚点

事件传递有两种方式:冒泡(默认)与捕获。
事件传递定义了元素事件触发的顺序。 如果你将 <p> 元素插入到 <div> 元素中,用户点击 <p> 元素, 哪个元素的 "click" 事件先被触发呢?在 冒泡 中,内部元素的事件会先被触发,然后再触发外部元素,即: <p> 元素的点击事件先触发,然后会触发 <div> 元素的点击事件。在 捕获 中,外部元素的事件会先被触发,然后才会触发内部元素的事件,即: <div> 元素的点击事件先触发 ,然后再触发 <p> 元素的点击事件。addEventListener() 方法可以指定 "useCapture" 参数来设置传递类型:addEventListener(event, function, useCapture);

<body>
  <div id="div">
    <p id="demo">点击</p>
  </div>
</body>
<script>
  document.getElementById("demo").addEventListener("click", function () {
    alert("oooo", true)
  });
  document.getElementById("div").addEventListener("click", function () {
    alert("9999")
  }, true);
</script>

清除事件监听

<body>
  <div id="div">
    remove
  </div>
  <p id="demo">点击</p>
</body>
<script>
  function demo() {
    console.log("oooooo")
  }
  document.getElementById("demo").addEventListener("click", demo);
  document.getElementById("div").addEventListener("click", function () {
    document.getElementById("demo").removeEventListener("click", demo);
  });
</script>

isNaN( )判断原理:
首先给内部Number( )进行转换,只要Number( )转换出来是数字直接为false,否则为true isNaN(“99999”)=>false ;除以0是无穷大,无穷大是一个数字:

{}是一个不完全空的对象,因为他的原型链上还有Object呢,而null就是完全空的对象,啥也没有,原型链也没有,所以null instanceof Object === false;[]就更不用说了,它的原型链上还比{}多一个Array。
所以,纯粹意义上初始化一个空对象应该用null,{}更像是初始化对象,和new一个没有key的Obejct是一样的。还有就是空数组转换成布尔类型返回的是true:

上一篇下一篇

猜你喜欢

热点阅读