关于面试:js基础常问面试题

3次阅读

共计 5840 个字符,预计需要花费 15 分钟才能阅读完成。

1.JS 中 letconst有什么用?

在古代 js 中,let&const是创立变量的不同形式。在晚期的 js 中,咱们应用 var 关键字来创立变量。let&const关键字是在 ES6 版本中引入的,上面咱们来看下 var let const 的区别:

var 申明变量存在变量晋升,let 和 const 不存在变量晋升

console.log(a); // undefined  ===>  a 已申明还没赋值,默认失去 undefined 值
var a = 1;
console.log(b); // 报错:b is not defined  ===> 找不到 b 这个变量
let b = 2;
console.log(c); // 报错:c is not defined  ===> 找不到 c 这个变量
const c = 3;

let、const 属于块级作用域
顾名思义,就是只在以后代码块起作用,let 和 const 区别:const 用来申明一个只读的常量, 一旦申明,常量的值不可扭转,申明时必须设置初始化值, 否则会报错

块级作用域的长处
1、防止内层变量笼罩外层变量
2、防止用来计数的循环变量泄露为全局变量
3、引入了块级作用域,容许在块级作用域之中申明函数

2. module.exports 和 exports 之间有什么区别?

moduleexportsNode.js给每个 js 文件内置的两个对象。能够通过 console.log(module)console.log(exports)打印进去。如果你在 main.js 中写入上面两行,而后运行$ node main.js:

console.log(exports);// 输入:{}
console.log(module);// 输入:Module {..., exports: {}, ...}(注:... 代表省略了其余一些属性)

从打印咱们能够看出,module.exportsexports 一开始都是一个空对象 {},实际上,这两个对象指向同一块内存。这也就是说module.exportsexports是等价的(有个前提:不去扭转它们指向的内存地址)。

例如:exports.age = 18module.export.age = 18,这两种写法是统一的(都相当于给最后的空对象{} 增加了一个属性,通过 require 失去的就是{age: 18})。

3. JS 中 == 和 === 区别是什么?

1、对于 string,number 等根底类型,===== 有区别

1)不同类型间比拟,==之比拟“转化成同一类型后的值”看“值”是否相等,===如果类型不同,其后果就是不等。
2)同类型比拟,间接进行“值”比拟,两者后果一样。

2、对于 Array,Object 等高级类型,===== 没有区别

进行“指针地址”比拟。

3、根底类型与高级类型,===== 有区别

1)对于 ==,将高级转化为根底类型,进行“值”比拟。
2)因为类型不同,=== 后果为false

4. 在 JS 中应用document.getElementsByClassName() 办法来获取具备类名的元素。

5. 解释一下 “use strict” ?

“use strict”是 ES5 中引入的 js 指令。应用 “use strict” 指令的目标是强制执行严格模式下的代码。在严格模式下,咱们不能在不申明变量的状况下应用变量。晚期版本的 js 疏忽了“use strict”

6. 用纯 JS 编写一个程序来反转字符串

应用内置函数:内置函数 reverse() 间接反转字符串。

str="jQuery";
str = str.split("")// 将字符串拆分成数组
str = str.reverse()// 反转数组
str = str.join("")// 将字符连接成字符串
alert(str); 

7.JS 中如何将页面重定向到另一个页面?

  1. 应用 location.href:window.location.href =“https://www.onlineinterviewquestions.com/”
  2. 应用 location.replace:window.location.replace("https://www.onlineinterviewquestions.com/;");

8. JS 中的 substr()substring()函数有什么区别

substr() 函数的模式为 substr(startIndex,length)。它从startIndex 返回子字符串并返回 ’length‘ 个字符数。

var s = "hello";
(s.substr(1,4) == "ello" ) // true 

substring() 函数的模式为 substring(startIndex,endIndex)。它返回从startIndexendIndex - 1的子字符串。

var s = "hello";
(s.substring(1,4) == "ell" ) // true 

9. JS 中的 Array.splice()Array.slice()办法有什么区别

话不多说,来看第一个例子:

var arr=[0,1,2,3,4,5,6,7,8,9];// 设置一个数组
console.log(arr.slice(2,7));//2,3,4,5,6
console.log(arr.splice(2,7));//2,3,4,5,6,7,8
// 由此咱们简略揣测数量两个函数参数的意义,
slice(start,end)第一个参数示意开始地位, 第二个示意截取到的地位(不蕴含该地位)
splice(start,length)第一个参数开始地位, 第二个参数截取长度 

接着看第二个:

var x=y=[0,1,2,3,4,5,6,7,8,9]
console.log(x.slice(2,5));//2,3,4
console.log(x);[0,1,2,3,4,5,6,7,8,9]原数组并未扭转
// 接下来用同样形式测试 splice
console.log(y.splice(2,5));//2,3,4,5,6
console.log(y);//[0,1,7,8,9]显示原数组中的数值被剔除掉了 

slicesplice 尽管都是对于数组对象进行截取, 然而二者还是存在显著区别, 函数参数上 slicesplice第一个参数都是截取开始地位,slice第二个参数是截取的完结地位 (不蕴含), 而splice 第二个参数 (示意这个从开始地位截取的长度),slice 不会对原数组产生变动, 而 splice 会间接剔除原数组中的截取数据!

10. 如何在 JS 中动静增加 / 删除对象的属性?

咱们能够应用 object.property_name = value 向对象增加属性,delete object.property_name 用于删除属性。

例如:

let user = new Object();
// adding a property
user.name='Anil';
user.age  =25;
console.log(user);
delete user.age;
console.log(user); 

11. 解释一下什么是 promise?

promise是 js 中的一个对象,用于生成可能在未来产生后果的值。值能够是已解析的值,也能够是阐明为什么未解析该值的起因。

promise 能够有三种状态:

  • pending:初始状态,既不是胜利也不是失败
  • fulfilled:意味着操作齐全胜利
  • rejected:意味着操作失败

一个期待状态的 promise 对象可能胜利后返回一个值,也能失败后带回一个谬误
当这两种状况产生的时候,处理函数会排队执行通过 then 办法会被调用。

12. 数组去反复的办法有哪些

1. 应用 set

function uniquearray(array) {let unique_array= Array.from(set(array)) 
 return unique_array;
} 

2. 应用 filter

function unque_array (arr) {let unique_array = arr.filter(function(elem, index, self) {return index == self.indexOf(elem);
  })
  return unique_array;
}

 console.log(unique_array(array_with_duplicates)); 

3. 应用 for 循环

Array dups_names = ['Ron', 'Pal', 'Fred', 'Rongo', 'Ron'];
function dups_array(dups_names) {let unique = {};
 names.forEach(function(i) {If (!unique[i]) {unique[i] = true;    }
  });
return Object.keys(unique);}   // Ron, Pal, Fred, Rongo
Dups_array(names); 

13. undefined,null 和 undeclared 有什么区别?

1.null 示意 ” 没有对象 ”,即该处不应该有值,转为数值时为 0。典型用法是:

(1)作为函数的参数,示意该函数的参数不是对象。

(2)作为对象原型链的起点。

2.undefined 示意 ” 短少值 ”,就是此处应该有一个值,然而还没有定义,转为数值时为 NaN。典型用法是:

(1)变量被申明了,但没有赋值时,就等于 undefined。

(2) 调用函数时,应该提供的参数没有提供,该参数等于 undefined。

(3)对象没有赋值的属性,该属性的值为 undefined。

(4)函数没有返回值时,默认返回 undefined。

3.undeclared:js 语法错误,没有申明间接应用,js 无奈找到对应的上下文。

14. 列出 JS 根本和非根本数据类型之间的一些区别?

1. 目前 JS 中有 6 种根本数据类型: UndefinedNullBooleanNumberSymbolString。还有 1 种简单的数据类型————ObjectObject实质上是由一组无序的名值对组成的。ObjectArrayFunction 则属于援用类型。

2. 根本数据类型是不可变的,而非根本数据类型是可变的。

3. 根本数据类型是不可变的,因为它们一旦创立就无奈更改,但非根本数据类型刚可更改,意味着一旦创立了对象,就能够更改它。

4. 将根本数据类型与其值进行比拟,这意味着如果两个值具备雷同的数据类型并具备雷同的值,那么它们是严格相等的。

5. 非根本数据类型不与值进行比拟。例如,如果两个对象具备雷同的属性和值,则它们严格不相等。

15. BOM 和 DOM 的关系

BOM全称Browser Object Model,即浏览器对象模型,次要解决浏览器窗口和框架。

DOM全称Document Object Model,即文档对象模型,是 HTML 和 XML 的利用程序接口(API),遵循 W3C 的规范,所有浏览器公共恪守的规范。

JS 是通过拜访 BOM(Browser Object Model)对象来拜访、管制、批改客户端(浏览器),因为BOMwindow蕴含了 documentwindow 对象的属性和办法是间接能够应用而且被感知的,因而能够间接应用 window 对象的 document 属性,通过 document 属性就能够拜访、检索、批改 XHTML 文档内容与构造。因为 document 对象又是 DOM 的根节点。

能够说,BOM蕴含了 DOM(对象),浏览器提供进去给予拜访的是BOM 对象,从 BOM 对象再拜访到 DOM 对象,从而 js 能够操作浏览器以及浏览器读取到的文档。

16. JS 中的深拷贝与浅拷贝的区别?

  • 深拷贝递归地复制新对象中的所有值或属性,而拷贝只复制援用。
  • 在深拷贝中,新对象中的更改不会影响原始对象,而在浅拷贝中,新对象中的更改,原始对象中也会跟着改。
  • 在深拷贝中,原始对象不与新对象共享雷同的属性,而在浅拷贝中,它们具备雷同的属性。

17. 如何将 JS 日期转换为 ISO 规范

toISOString() 办法用于将 js 日期转换为 ISO 规范。它应用 ISO 规范将 js Date 对象转换为字符串。如:

var date = new Date();
var n = date.toISOString();
console.log(n);
// YYYY-MM-DDTHH:mm:ss.sssZ 

18. 解释 JS 中的事件冒泡和事件捕捉

事件捕捉和冒泡: 在 HTML DOM API 中,有两种事件流传办法,它们决定了接管事件的程序。两种办法是事件冒泡和事件捕捉。第一个办法事件冒泡将事件指向其预期的指标,第二个办法称为事件捕捉,其中事件向下达到元素。

事件捕捉

捕捉过程很少被应用,然而当它被应用时,它被证实是十分有用的。这个过程也称为 滴流模式。在这个过程中,事件首先由最外层的元素捕捉,而后流传到最外部的元素。例如:

<div>
  <ul>
    <li></li>
  </ul>
</div> 

从下面的示例中,假如单击事件产生在 li 元素中,在这种状况下,捕捉事件将首先解决div,而后解决ul,最初命中指标元素li

事件冒泡

冒泡的工作原理与冒泡相似,事件由最外部的元素解决,而后流传到内部元素。

<div>
  <ul>
    <li></li>
  </ul>
</div> 

从下面的例子中,假如 click 事件的确产生在冒泡模型中的 li 元素中,该事件将首先由 li 解决,而后由 ul 解决,最初由 div 元素解决。

19. 如何在 JS 中编码和解码 URL

encodeURI() 函数用于在 JS 中对 URL 进行编码。它将 url 字符串作为参数并返回编码的字符串。

留神 encodeURI() 不会编码相似这样字符:/ ? : @ & = + $ #,如果须要编码这些字符,请应用encodeURIComponent()。用法:

var uri = "my profile.php?name=sammer&occupation=pāntiNG";
var encoded_uri = encodeURI(uri); 

decodeURI() 函数用于解码 js 中的 URL。它将编码的 url 字符串作为参数并返回已解码的字符串,用法:

var uri = "my profile.php?name=sammer&occupation=pāntiNG";
var encoded_uri = encodeURI(uri);
decodeURI(encoded_uri); 

20. 如何在 JS 中克隆对象

Object.assign() 办法用于在 JS 中克隆对象。如:

var x = {myProp: "value"};
var y = Object.assign({}, x); 
正文完
 0