牛客刷题知识点-JS

1、Math.round()函数返回一个数字四舍五入后最接近的整数

如果参数的小数部分大于0.5,四舍五入到相邻的绝对值更大的整数

如果参数的小数部分小于0.5,四舍五入到相邻的绝对值更小的整数

如果参数的小数部分等于0.5,四舍五入到相邻的在正无穷(+∞)方向上的整数。

例:

x=Math.round(2019.49) ;      //2019

x=Math.round(2019.5);        //2020

x=Math.round(-2019.5);        //-2019

x=Math.round(-2019.51);      //-2020

2、摘自《JavaScript高级程序设计》的函数定义

函数声明

function sum(a,b){

    return a+b

}

函数表达式

var sum = function(a,b){

    return a+b

}

Function构造函数【从技术角度讲,这是一个函数表达式】

var sum = new Function('a','b','return a+b')//不推荐使用,影响函数解析性能

3、闭包函数:

1.函数内部定义函数  2.内部函数使用了非它作用域的参数。

闭包函数作用:1.延长参数的生命周期  2.变量私有化。

局部变量会常驻在内存中。

 var f1 = outer();

 f1();

 f1(); // 变量常驻内存

每次外部函数执行的时 候,外部函数的引用地址不同,都会重新创建一个新的地址。

 var f1 = outer();

var f2 = outer(); // 外部函数每次调用,都会开辟新的内存空间。

4、js 阻止 dom 的解析, 是因为 js 有可能影响dom的解析,比如在 js 里面新增 dom 等这些操作。

而 dom 的渲染 是需要等js, css都解析完成后才进行的,所有代码都执行完之后,颜色就是黑色,不存在颜色变化的情况。

5、基本数据类型:存储在栈中的简单数据段;引用数据类型:存储在堆中的对象,存储在栈中的值是一个指针,指向 存储对象的内存地址。

function fn(o,val){ //函数传参  形参o为引用数据类型  val为基本数据类型

          o.b = 1; // 此处的o和函数外的obj共用一个内存地址(相互影响),修改o(指针改变,但内存地址没变),函数外面的 obj也会改变

          val = 1; // val为基本数据类型  在函数内修改值不会影响函数外面的基本数据类型(互不影响)

}

var obj = {b:0};

var num = 0;

fn(obj,num);

console.log(obj,num);  //传实参

6、undefined和null与任何有意义的值比较返回的都是false,但是null与undefined之间互相比较返回的是true。

console.log(null == false); 

console.log(null == true);

console.log(undefined == false);

console.log(undefined == true); 

console.log(undefined == null);

console.log(undefined == undefined);

console.log(null == null);

7、布尔类型里只有这几参数个返回false,其它都为true

Boolean(undefined) // false

Boolean(null) // false 

Boolean(0) // false 

Boolean(NaN) // false 

Boolean('') // false

8、obj.log和console.log指向同一个函数, 使用obj.log.call(console)其实就是调用console.log()。 console.log(message)接受参数message并打印 obj.log.call(console, this)与console.log(this)相同,而在全局作用域下这个this为window!

9、number、string、array、undefined都不是保留字(首字母不分大小写)

10、原型链继承,如果属性有引用类型的,改变一个,则其他的也会跟着改变

11、Symbol为ES6新增的基本数据类型,表示独一无二的值。

Symbol()函数会返回symbol类型的值,每个从Symbol()返回的symbol值都是唯一的。

Symbol.for() 返回由给定的 key 找到的 symbol,否则就是返回新创建的 symbol

因此s1和s2是两个值都为a的不同symbol,s3创建了key为b的symbol,s4根据b找到s3的symbol,所以s1≠s2,s3==s4

var s1 = Symbol('a');

var s2 = Symbol('a');

var s3 = Symbol.for('b');//找不到key=b的symbol,新创建一个key为b的symbol

var s4 = Symbol.for('b'); //找到s3刚创建的symbol

console.log(typeof s1);...①

//typeof s1 = 'symbol'  symbol为es6新增类型

console.log(s1==s2); ...②

//symbol类型每个都是独一无二的

console.log(s3==s4); ...③

//s3,s4的key都是b,都找到同一个symbol,true

12、首先调用时会先在自身实例上找方法,恰好本身就有 do 方法,所以本身就不会再往原型上找了

13、dom2规定的事件流包括3个阶段:①事件捕获,②处于目标阶段(事件处理),③事件冒泡阶段。

14、iterable是一个全部为promise对象的数组,只要数组中有一个promise实例被reject,那么最终的promise触发catch,只有数组中全部promise实例都resolve才会触发then,并且要带上iterable中全部promise,其中promise实例将会被结果代替

15、①第二个参数单位是ms ②第一个参数为函数名时(没有括号) 则经过后面时间后执行该函数 ③第一个参数为 带括号 函数名时,会立即执行函数然后将返回的参数作为 第一个参数 。除非给这个带括号的函数名加上引号。

window.setTimeout(checkState(), 10000); //立即被调用 

window.setTimeout(checkState, 10000); // 10s后被调用 

window.setTimeout("checkState()", 10000); //10s后被调用 注意和第一个的区别

16、在执行前八行代码的时候在回调函数队列里面依次添加三个回调函数,此时回调函数队列为【2,3,1】然后在while循环里面停留三秒,这时已经把回调函数队列里面的三个回调函数的等待时间都花光了,等循环停留三秒结束后,立刻执行回调函数队列里面的函数,所以3秒以后同时输出2 3 1。

let date = new Date()

setTimeout(() => {

    console.log('1')

}, 2000)

setTimeout('console.log(2)',1000);

setTimeout(function() {

  console.log('3')

}, 1500);

while((new Date() - date) < 3000) {}

17、ECMAScript中,变量可以存放两种类型的值,即原始值和引用值。

原始值是存储在栈中的简单数据段,也就是说,它们的值直接存储在变量访问的位置。

引用值是存储在堆中的对象,也就是说,存储在变量处的值是一个指针,指向存储对象的内存处。

ECMAScript中有5种原始类型,即undefined、null、number、string、boolean。

选项中的值分别是:string、number、null,而最后一个是数组,数组是一个对象,所以是引用值。

18、结果就是a,b,c进行逻辑运算,因为a,b为非空字符串所以alert(true),c为空字符串所以alert(false)

var a="undefined";

var b="false";

var c="";

19、js里没有函数重载,如果存在两个同名函数,后一个函数会覆盖前一个函数;解析器在读取、加载数据时会先读取函数声明再读取函数表达式。综上,y和z的值都为4.

20、注意区分属性和方法,也即有没有()括号。

详见:https://developer.mozilla.org/zh-CN/docs/Web/API/Node/parentNode

注意看左侧栏的属性和方法,并区分。

总结:

node节点有几个常用的属性:

firstChild

lastChild

nextSibling:下一个兄弟节点

previousSibling:前一个兄弟节点

这些都是属性,都不需要添加括号的。

21、子类必须在constructor方法中调用super方法,否则新建实例时会报错。这是因为子类自己的this对象,必须先通过父类的构造函数完成塑造,得到与父类同样的实例属性和方法,然后再对其进行加工,加上子类自己的实例属性和方法。如果不调用super方法,子类就得不到this对象

22、关于Date 对象方法的说明: 

Date() 返回当日的日期和时间。 getDate() 从 Date 对象返回一个月中的某一天 (1 ~ 31)。 getDay() 从 Date 对象返回一周中的某一天 (0 ~ 6)。 getYear() 从 Date 对象以四位数字返回年份。 getTime() 返回 1970 年 1 月 1 日至今的毫秒数。

23、var a=10; function a(){} console.log(typeof a);函数提升大于变量提升,变量提升会提升到除函数声明的后面;变量提升,但是赋值不提升、函数表达式亦是如此,所以我觉得应该是下面的步骤  function a(){} var a;

a=10;//如果没有这一步赋值操作的话,类型还是function console.log(typeof a);//a=10 number

这边不是因为什么之后重声明才变为number,是因为变量赋值才变的

如果有多个var a ,那a的类型最后就会是最后赋值操作的参数类型。

如果有什么不对的地方,欢迎大家指出说的不到位或者有错的地方。   

24、符号代表的意义

^ : 匹配字符串的开头;

$ : 匹配字符串的结尾;

* ; 出现零次到多次;

+ :出现一次到多次;

?: 出现零次或一次;

. : 除了\n以外的任意字符

{n} : 出现n次;

{n,m}: 出现n到m次;

{n,}: 出现n次到多次

25、改变数据的方法有(共7种):

splice、pop、push、shift、unshift、sort、reverse

Concat并不会改变自身数组

26、Symbol 本质上是一种唯一标识符,可用作对象的唯一属性名,这样其他人就不会改写或覆盖你设置的属性值。

注意事项

Symbol值不能与其他类型的值进行运算

Symbol 值不可以和其他类型值进行混合运算,否则会报错

Symbol 值如果想要作为属性名,那就不能再用点运算符,因为点运算符后面跟的总是字符串

在对象内部使用Symbol 值作为属性名的时候,必须要将值放在方括号中

27、call,apply

1、call,apply都属于Function.prototype的一个方法,它是JavaScript引擎内在实现的,因为属于Function.prototype,所以每个Function对象实例(就是每个方法)都有call,apply属性。既然作为方法的属性,那它们的使用就当然是针对方法的了,这两个方法是容易混淆的,因为它们的作用一样,只是使用方式不同。

2、语法:foo.call(this, arg1,arg2,arg3) == foo.apply(this, arguments) == this.foo(arg1, arg2, arg3);

3、相同点:两个方法产生的作用是完全一样的。

4、不同点:方法传递的参数不同。

28、任何数值除以0都会导致错误而终止程序执行,但是在 JavaScript 中,会返回出NaN,不影响后面程序

value = 0 / num; num = 0;

//value = NaN,

//并不会报错,因此走完try,而不会走进catch

//finally无论是否出现异常都会在最后执行

try...catch 用来捕获try{}代码段中可能会发生的异常,catch子句包含try块中抛出异常时要执行的语句。

如果在try块中有任何一个语句(或者从try块中调用的函数)抛出异常,控制立即转向catch子句。如果在try块中没有异常抛出,会跳过catch子句。

finally子句在try块和catch块之后执但是在下一个try声明之前执行。无论是否有异常抛出或捕获它总是执行。

29、什么是reflow和repaint(原文链接:http://www.cnblogs.com/Peng2014/p/4687218.html)

reflow:例如某个子元素样式发生改变,直接影响到了其父元素以及往上追溯很多祖先元素(包括兄弟元素),这个时候浏览器要重新去渲染这个子元素相关联的所有元素的过程称为回流。

reflow:几乎是无法避免的。现在界面上流行的一些效果,比如树状目录的折叠、展开(实质上是元素的显 示与隐藏)等,都将引起浏览器的 reflow。鼠标滑过、点击……只要这些行为引起了页面上某些元素的占位面积、定位方式、边距等属性的变化,都会引起它内部、周围甚至整个页面的重新渲 染。通常我们都无法预估浏览器到底会 reflow 哪一部分的代码,它们都彼此相互影响着。

repaint:如果只是改变某个元素的背景色、文 字颜色、边框颜色等等不影响它周围或内部布局的属性,将只会引起浏览器 repaint(重绘)。repaint 的速度明显快于 reflow

下面情况会导致reflow发生

1:改变窗口大小

2:改变文字大小

3:内容的改变,如用户在输入框中敲字

4:激活伪类,如:hover

5:操作class属性

6:脚本操作DOM

7:计算offsetWidth和offsetHeight

8:设置style属性

30、冒泡事件很多,个人觉得记住常见的不支持冒泡事件就可以了

有:①focus

      ②blur

      ③mouseenter

      ④mouseleave

      ⑤load

      ⑥unload

      ⑦resize

不支持冒泡:妈(mouseenter)妈(mouseleave)不(blur)放(focus)心你(load,unload,resize)

31、hasOwnProperty:是用来判断一个对象是否有你给出名称的属性或对象。不过需要注意的是,此方法无法检查该对象的原型链中是否具有该属性,该属性必须是对象本身的一个成员。

isPrototypeOf :是用来判断要检查其原型链的对象是否存在于指定对象实例中,是则返回true,否则返回false。

32、JQuery中选择器常用有三种:

①元素选择器:$("TagName") 

②ID 选择器:  $("#ID")

③类选择器:$(".className")

33、null 只有 null == undefined 和null == null 这两种情况才是true.

34、1. ES6 规定,默认的 Iterator 接口部署在数据结构的Symbol.iterator属性,或者说,一个数据结构只要具有Symbol.iterator属性,就可以认为是“可遍历的”(iterable)。

Symbol.iterator属性本身是一个函数,就是当前数据结构默认的遍历器生成函数。执行这个函数,就会返回一个遍历器。至于属性名Symbol.iterator,它是一个表达式,返回Symbol对象的iterator属性,这是一个预定义好的、类型为 Symbol 的特殊值,所以要放在方括号内 2. throw 异常信息;中止程序抛出异常,可用于中止程序 3. foo 是遍历器生成函数,遍历的时候遇到 throw 就中止遍历和抛出错误。

35、对于“+”来说,有两个含义:第一个含义是做字符串拼接,第二个含义是加减法中的加法。

    1,如果操作数里有一个是字符串,其他的值将被转换成字符串;

    2,其他情况,操作数转换成数字执行加法运算。

而对于“ - ”来说,只有一个含义,就是做减法,自然不会转化成字符串了。

36、RegExp 对象的主要方法是 exec(),该方法是专门为捕获组而设计的。 exec()接受一个参数,即要应用模式的字符串,然后返回包含第一个匹配项信息的数组;或者在没有匹配项的情况下返回 null。

37、对于static我们需要明白两点:

1.为什么有static?

在定义类的时候,类中都会有相应的属性和方法。而属性和方法都是通过创建本类对象调用的。当在调用对象的某个方法时,这个方法没有访问到对象的特有数据时,方法创建这个对象有些多余。可是不创建对象,方法又调用不了,这时就会想,那么我们能不能不创建对象,就可以调用方法呢?这就有了static

2.被static修饰的成员变量或方法属于类,不属于这个类的某个对象。

弄明白这两点我们再来看题目就比较简单了:

A:static用于修饰类,其关键字this表示类本身;

B:dog方法为静态方法,需要通过类调用;

C:break方法为成员方法,需要通过实例对象调用;

38、JavaScript RegExp 对象有 3 个方法:test()、exec() 和 compile()。

(1)test() 方法用来检测一个字符串是否匹配某个正则表达式,如果匹配成功,返回 true ,否则返回 false;

(2)exec() 方法用来检索字符串中与正则表达式匹配的值。exec() 方法返回一个数组,其中存放匹配的结果。如果未找到匹配的值,则返回

null;

(3)compile() 方法可以在脚本执行过程中编译正则表达式,也可以改变已有表达式。

39、A. parseInt转换为整数,默认为10进制,结果为10

B. floor向下取整,结果为10 

C. ceil向上取整,结果为11

D. split操作数必需为正则或字符串,结果为TypeError

40、change可以用作输入验证的事件,change(fn)只是一种实现方式,还有其他实现方式:

原生js的onchange属性,html属性onchange,addEventListener(onchange,fn)都是实现方式,jquery中除了$(selector).change(fn)外还有bind(change,fn)

41、parseFloat 解析一个字符串,并返回一个浮点数,toFixed 把数字转换为字符串,结果的小数点后有指定位数的数字,Math.round 把一个数字舍入为最接近的整数,toPrecision 把数字格式化为指定的长度

42、JS中,可以将对象分为“内部对象”、“宿主对象”和“自定义对象”三种。

1,内部对象

js中的内部对象包括Array、Boolean、Date、Function、Global、Math、Number、Object、RegExp、String以及各种错误类对象,包括Error、EvalError、RangeError、ReferenceError、SyntaxError和TypeError。

其中Global和Math这两个对象又被称为“内置对象”,这两个对象在脚本程序初始化时被创建,不必实例化这两个对象。

2.宿主对象

宿主对象就是执行JS脚本的环境提供的对象。对于嵌入到网页中的JS来说,其宿主对象就是浏览器提供的对象,所以又称为浏览器对象,如IE、Firefox等浏览器提供的对象。不同的浏览器提供的宿主对象可能不同,即使提供的对象相同,其实现方式也大相径庭!这会带来浏览器兼容问题,增加开发难度。

浏览器对象有很多,如Window和Documen,Element,form,image,等等。

3.自定义对象

顾名思义,就是开发人员自己定义的对象。JS允许使用自定义对象,使JS应用及功能得到扩充

43、shift 前删 pop 尾删 unshift 前插 push 尾插

44、暂时性死区:在代码块内,使用let和const命令声明变量之前,该变量都是不可用的,语法上被称为暂时性死区。

45、因为"+"和"*"都是贪婪匹配,它们会尽可能多地匹配字符,所以"\d+"匹配"75","\w*"匹配"team2017",而"/g"就没有表演的机会了。

46、javascript 中所有的数值类型都是双精度存储的,使用 64bit,64bit 等于 8byte

47、Promise 对象代表一个异步操作,有3种状态:Pending(进行中)、Resolved(已完成,又称Fulfilled)和Rejected(已完成)’。

48、Boolean类型转换:

    1.对于String:只有非空字符串为真

    2.对于Number:除了0和NaN之外都为真

    3.对于Boolean:true为真

    4.对于Object:除了null之外都为真

    5.undefined为false;

49、数字 + 字符串  => (数字).toString() + 字符串  如: 1 + '2' = 12。数字 -  字符串  => 数字 - Number(字符串)    如: 1 - '2'  = -1

50、1 == true  // 布尔值会转成number true即为1 所以结果是true

2 == true  // 布尔值会转成number true即为1 所以结果是false

3 == true  // 布尔值会转成number true即为1 所以结果是false

1 == false  // 布尔值会转成number false即为0 所以结果是false

0 == false  // 布尔值会转成number false即为0 所以结果是true

51、bgcolor是标签属性,用于设置背景颜色,只有body  table  tr  td元素有该属性。

52、执行的机制(两数比较,小的排在大的前面):

a - b < 0,那么 a 会被排列到 b 之前;

a - b = 0,a 和 b 的相对位置不变。备注: ECMAScript 标准并不保证这一行为,而且也不是所有浏览器都会遵守(例如 Mozilla 在 2003 年之前的版本);

a - b > 0,那么 b 排列到 a 之前。

53、①Js是单线程的,Settimeout是异步宏任务,所以代码执行遇到异步的,就放在事件队列中的,等线程中的任务执行完后才会执行事件队列中的任务。② let是es6中声明变量的方式,有自己的作用域块,可以放变量,所以let绑定for循环时,每个i都有自己的值. 在这个for循环中就是满足一次条件向事件队列中添加一个打印i的事件,且每个事件中的i有自己的值 ③Var没有作用域块,for循环的变量就会后一个覆盖前一个,当循环完毕时i就只有一个值,又因为for循环的判断条件是不满足跳出,所以i最后是2而不是1 ④这些完了后执行事件队列中的任务,就打印了0122

54、加号优先级高于 三目运算。

55、{} + 'b' -> NaN

{} + 'a' -> NaN

{} + 'b' > {} + 'a' -> false

({} + 'b' > {} + 'a') -> true

56、AMD 是 RequireJS 在推广过程中对模块定义的规范化产出。CMD 是 SeaJS在推广过程中对模块定义的规范化产出。

区别:

1. 对于依赖的模块,AMD 是提前执行,CMD是延迟执行。

2. CMD 推崇依赖就近,AMD 推崇依赖前置。

57、1、定义

(l)表示第一个分组里有l

\1表示所获取的第1个()匹配的引用

/g表示全局匹配

$1表示第一个分组里的值l

2、所以

(l)\l 表示匹配两个连续字符ll,即ll

(l)\l/g 表示全局匹配两个连续字符ll即llll

str.replace(/(l)\1/g, '$1') 表示将ll替换成l

3、最终

Hellllo =》 Hello

58、静态语言(强类型语言)

静态语言是在编译时变量的数据类型即可确定的语言,多数静态类型语言要求在使用变量之前必须声明数据类型。 

例如:C++、Java、Delphi、C#等。

动态语言(弱类型语言)

动态语言是在运行时确定数据类型的语言。变量使用之前不需要类型声明,通常变量的类型是被赋值的那个值的类型。 

例如PHP/ASP/Ruby/Python/Perl/ABAP/SQL/JavaScript/Unix Shell等等。

59、/^1[0-9]{10}$/

1.  ^1 开头一个1

2.  [0-9] {10}  十个数,每个数都可以是 0~9 之间任意的数

3.  $ 结束标记

4.  不要忘记放在 / / 之间哦 

60、页面的性能指标详解:

白屏时间(first Paint Time)——用户从打开页面开始到页面开始有东西呈现为止

首屏时间——用户浏览器首屏内所有内容都呈现出来所花费的时间

用户可操作时间(dom Interactive)——用户可以进行正常的点击、输入等操作,默认可以统计domready时间,因为通常会在这时候绑定事件操作

总下载时间——页面所有资源都加载完成并呈现出来所花的时间,即页面 onload 的时间

61、typeof

undefined        值未定义

boolean          布尔值

string              字符串

number            数值(整形和浮点)

object                对象或null

function            函数

62、常见的请求头和相应头都有什么呢? 

1)请求(客户端->服务端[request]) 

    GET(请求的方式) /newcoder/hello.html(请求的目标资源) HTTP/1.1(请求采用的协议和版本号) 

    Accept: */*(客户端能接收的资源类型) 

    Accept-Language: en-us(客户端接收的语言类型) 

    Connection: Keep-Alive(维护客户端和服务端的连接关系) 

    Host: localhost:8080(连接的目标主机和端口号) 

    Referer: http://localhost/links.asp(告诉服务器我来自于哪里) 

    User-Agent: Mozilla/4.0(客户端版本号的名字) 

    Accept-Encoding: gzip, deflate(客户端能接收的压缩数据的类型) 

    If-Modified-Since: Tue, 11 Jul 2000 18:23:51 GMT(缓存时间)  

    Cookie(客户端暂存服务端的信息) 

    Date: Tue, 11 Jul 2000 18:23:51 GMT(客户端请求服务端的时间) 

2)响应(服务端->客户端[response])

    HTTP/1.1(响应采用的协议和版本号) 200(状态码) OK(描述信息)

    Location: http://www.baidu.com(服务端需要客户端访问的页面路径) 

    Server:apache tomcat(服务端的Web服务端名)

    Content-Encoding: gzip(服务端能够发送压缩编码类型) 

    Content-Length: 80(服务端发送的压缩数据的长度) 

    Content-Language: zh-cn(服务端发送的语言类型) 

    Content-Type: text/html; charset=GB2312(服务端发送的类型及采用的编码方式)

    Last-Modified: Tue, 11 Jul 2000 18:23:51 GMT(服务端对该资源最后修改的时间)

    Refresh: 1;url=http://www.it315.org(服务端要求客户端1秒钟后,刷新,然后访问指定的页面路径)

    Content-Disposition: attachment; filename=aaa.zip(服务端要求客户端以下载文件的方式打开该文件)

    Transfer-Encoding: chunked(分块传递数据到客户端)  

    Set-Cookie:SS=Q0=5Lb_nQ; path=/search(服务端发送到客户端的暂存数据)

    Expires: -1//3种(服务端禁止客户端缓存页面数据)

    Cache-Control: no-***(服务端禁止客户端缓存页面数据)  

    Pragma: no-***(服务端禁止客户端缓存页面数据)   

    Connection: close(1.0)/(1.1)Keep-Alive(维护客户端和服务端的连接关系)  

    Date: Tue, 11 Jul 2000 18:23:51 GMT(服务端响应客户端的时间) 

在服务器响应客户端的时候,带上Access-Control-Allow-Origin头信息,解决跨域的一种方法。

63、JavaScript实现继承共6种方式:

原型链继承、借用构造函数继承、组合继承、原型式继承、寄生式继承、寄生组合式继承。(没有关联继承)

64、选择AD

A. getElementById() 方法可返回对拥有指定 ID 的第一个对象的引用。

语法:document.getElementById(id)

参数为id值。

D.querySelector() 方法返回文档中匹配指定 CSS 选择器的一个元素。

所以要获取ID为a的DOM元素,需要加上#+id名。也就是document.querySelector("#a");

65、2.toString()将会优先将小数点解析为数字小数点

2..toString()因为连续的两个小数点不符合number的格式规则,第二个小数点才会被解析为调用方法

66、1、\w表示字母、数字、下划线  \W表示除了字母、数字下划线的字符

2、/a?/  ?量词表示匹配0次或1次  + 表示匹配一次或多次  * 表示匹配0次或无数次 

3、i 表示忽略大小写  g表示全局匹配 m表示多行匹配

4、捕获组使用  \1

67、cookie的有效时间默认为-1,如果不进行设置的话,就会默认在浏览器会话关闭时结束。

可以通过setMaxAge()方法设置cookie的生命期。

当setMaxAge(0)表示立刻删除该浏览器上指定的cookie

68、requestAnimationFrame虽然是异步函数,但是由于i是用let定义的,每一次都会生成一个块级作用域,来把当前值和requestAnimationFrame放在这个作用域中

69、1. 变量声明、函数声明都会被提升到作用域顶处;2. 当出现相同名称时,优先级为:变量声明(foo#1) < 函数声明(foo#2) < 变量赋值(foo#3)

70、jq:  $("title").text("标题标题");js:  document.title ="新的标题内容";

71、没有length()方法,array.length中length为属性

72、call与apply的第一个参数都为this的指向,call后面的参数为传入的参数列表,apply为参数的数组.

73、匿名函数具有全局性,this指向windows

74、代码回收规则如下:

1.全局变量不会被回收。

2.局部变量会被回收,也就是函数一旦运行完以后,函数内部的东西都会被销毁。

3.只要被另外一个作用域所引用就不会被回收

75、 var obj = () ,= 的右边要求是一个值,满足数据类型的值即可。而()是表达式,这个表达式里面什么都没有,也就是说不满足=右边为值的要求,因此会报错。 如果在script标签内单独写()是不会报错的,浏览器当它是一条语句(里面什么都没有而已)。

76、prototype和__proto__ 的关系。主要有以下三点:

1)函数(或构造函数)身上才有 prototype (prototype名字叫原型,原型是一个对象);

2)而其他任何通过构造函数实例化出来的对象(不包括null、undefined)身上都有 __proto__(__proto__是隐式原型,隐式原型也一个对象)

3)实例化对象的__proto__ 就是 构造函数的 prototype  (===关系)

附:undefind 和 null 既没有prototype也没有 __proto__  ,因为它俩不是函数,也不是函数实例化出来的对象

77、①执行顺序是先执行同步的任务--输出1,3,5 ②在执行异步任务:其中异步任务分为宏任务和微任务,微任务优先级高于宏任务。 promise 是微任务,会在当前轮事件循环结束前执行; setTimeout 是宏任务,在下一轮事件循环执行; 所以这个 setTimeout 设置的定时器被取消掉了。 ③同步→异步→回调

78、设置一个属性,要么目标.setAttribute(属性名,值),要么目标.属性名=值

79、JavaScript 中包含以下 7 个全局函数,用于完成一些常用的功能(以后的章节中可能会用到):

escape( )、eval_r( )、isFinite()、isNaN( )、parseFloat( )、parseInt( )、unescape( )

80、history.forward与back都是没有参数的,只有go有参数

81、noscript 元素用来定义在脚本未被执行时的替代内容(文本)

82、为了解决AngularJS性能问题,编译阶段应分为两个阶段

1,compile (绑定DOM)   

2,link(数据绑定)。

所以绑定dom应该在dom生成以后绑定的。不过也可能是动态生成的

83、Son.prototype = Father.prototype; 

son的原型对象和father的原型对象一致

84、Generator 函数是一个普通函数,但是有两个特征。一是,function关键字与函数名之间有一个星号;二是,函数体内部使用yield表达式,定义不同的内部状态(yield在英语里的意思就是“产出”)。

function* helloWorldGenerator() {

  yield 'hello';

  yield 'world';

  return 'ending';

}

var hw = helloWorldGenerator();

85、函数未经new 直接调用时,在严格模式下内部的this 为undefined。非严格模式时 this 为全局对象 也就是window对象

86、语句 var a = b =1; 是语句 b = 1; 和 var a = b;的简写, b 成为一个全局变量(没有var前缀),加不加var关系声明的变量是全局变量还是局部变量

87、“同步模式”和“异步模式”:

(1)同步模式:就是后一个任务等待前一个任务结束,然后再执行,程序的执行顺序与任务的排列顺序是一致的、同步的。

(2)异步模式:完全不同,每一个任务有一个或多个回调函数(callback),前一个任务结束后,不是执行后一个任务,而是执行回调函数,后一个任务则是不等前一个任务结束就执行,所以程序的执行顺序与任务的排列顺序是不一致的、异步的。

JavaScript中实现异步编程模式的4种方法,回调函数、事件监听、发布/订阅、Promises对象:

(1)回调函数:这是异步编程最基本的方法,优点是简单、容易理解和部署,缺点是不利于代码的阅读和维护,各个部分之间高度耦合(Coupling),流程会很混乱,而且每个任务只能指定一个回调函数。

 例:假定有两个函数f1和f2,后者等待前者的执行结果,如果f1是一个很耗时的任务,可以考虑改写f1,把f2写成f1的回调函 数。

(2)事件监听:任务的执行不取决于代码的顺序,而取决于某个事件是否发生。优点是比较容易理解,可以绑定多个事件,每个事件可以指定  多个回调函数,而且可以”去耦合”(Decoupling),有利于实现模块化。缺点是整个程序都要变成事件驱动型,运行流程会变 得很不清晰。 例:为f1绑定一个事件,当f1发生done事件,就执行f2。

(3)发布/订阅:我们假定,存在一个”信号中心”,某个任务执行完成,就向信号中心”发布”(publish)一个信号,其他任务可以向信号中心”订  阅”(subscribe)这个信号,从而知道什么时候自己可以开始执行。这就叫做”发布/订阅模式”(publish-subscribe pattern), 又称”观察者模式”(observer pattern)。  这种方法的性质与”事件监听”类似,但是明显优于后者。因为我们可以通过查看”消息中心”,了解存在多少信号、每个信号 有多少订阅者,从而监控程序的运行。

(4)Promises对象:是CommonJS工作组提出的一种规范,目的是为异步编程提供统一接口。简单说,它的思想是,每一个异步任务返回一个  Promise对象,该对象有一个then方法,允许指定回调函数。回调函数变成了链式写法,程序的流程可以看得很清楚,而且有一整套的配套方法,可以实现许多强大的功能。例:f1的回调函数f2,f1().then(f2);

88、操作符之间的优先级(高到低):算数操作符 → 比较操作符 → 布尔(逻辑)操作符 → “=”赋值符号

逻辑操作符中,逻辑与(&&)优先级高于逻辑或(||)

所以执行顺序为

① 4 >= 6,结果是false(比较操作符返回布尔值)

② true && 1,结果是1(逻辑与的规则:第一个操作数是真值,则返回第二个操作数)

原式变为 false || 1 || false(按正常顺序执行)

③ false || 1,结果是1(逻辑或的规则:第一个操作数是假值,则返回第二个操作数)

④ 1 || false,结果是1(逻辑或的规则:第一个操作数是真值,则直接返回第一个操作数)

89、不能被冒泡的9个事件:① load和unload ② mouseenter和mouseleave ③ blur和focus ④ error ⑤ resize和abort从3个角度说可分为ui事件、鼠标移入移出事件、聚焦和失焦件

90、function* 声明 (function关键字后跟一个星号)定义了一个 生成器函数 ( generator function ),它返回一个  Generator  对象。

91、阻止默认事件:

e.preventDefault()

e.returnValue = false  (IE)

阻止冒泡:

e.stopPropagation()

e.cancelBubble = true (IE)

92、setMonth(n),这里是0-11分别对应1-12月

93、json中key也是个字符串,要加引号。key和value之间是用:号来表示的

94、filter是过滤出符合条件的元素。

every是检测数组是否所有元素都满足条件。

some是检测数组是否有满足条件的元素。

map是遍历数组,且对每个元素进行操作。

95、GET请求提交的参数体现在url中,POST请求的参数通过请求体提交

GET请求提交的数据有长度限制,因为参数都在url中,而POST请求则没有长度限制

GET请求会被浏览器主动缓存,而POST请求不会,除非手动设置

GET请求不如POST请求安全,因为参数会直接暴露在url上

96、typeof返回的类型

number、string、boolean、undefined、function、object共6种。

注意:其中Array与null返回的都是object

function(){}与class{}返回的都是function

97、JS中false、“”(空字符串)、0和NAN、null、undefined进行逻辑运算为false.特别注意的是typeof('0')=='string',即'0'是一个字符串对象,对对象进行逻辑运算结果为true

98、&& 运算,如果前面值为true,则结果为后面的值。如果前面值为false,则值为前值.

|| 运算,如果前面值为true,则结果为前面的值,如果前面的值为false,则结果为后面的值。

99、undefined隐式转换成Number类型值是啥

    1)Number(undefined) 结果是NaN,所以NaN+1 = NaN

    2)Number(null) 结果是0

    3)Number('a')结果是NaN

    4)  Number('')结果是0

    5)  Number(true)结果是1

    6)  Number(false)结果是0

    7)  Number([])结果是0

    8)  Number({})结果是NaN

100、不要在块内声明一个函数(严格模式会报语法错误)。如果确实需要在块中定义函数,可以使用函数表达式来声明函数。

101、delete只能删除对象属性

102、Confirm是弹出判断对话框,alert弹窗,pompt弹出对话框,opens打开新网页

103、Node 中的“微任务(microtasks)其实是一个统称,包含了两部分:

process.nextTick() 注册的回调 (nextTick task queue)

promise.then() 注册的回调 (promise task queue)

Node 在执行微任务时, 会优先执行 nextTick task queue 中的任务,执行完之后会接着执行 promise task queue 中的任务。所以如果 process.nextTick 的回调与 promise.then 的回调都处于主线程或事件循环中的同一阶段, process.nextTick 的回调要优先于 promise.then 的回调执行。

104、JavaScript的后缀文件是JS

105、添加数组项

数组[长度] = 数据:向数组末尾添加一个数据

数组.push(数据): 向数组末尾添加一个数据

数组.unshift(数据):向数组起始位置添加一个数据,会导致数组每一项的下标向后移动

数组.splice(下标, 0, 添加的数据): 从指定下标位置开始,删除0个,然后在该位置插入添加的数据,如果下标超过范围,则按照范围的边界进行处理。

push、unshift、splice可以添加多个数据

删除数据

delete 数组[下标]: 这种做法不会导致数组其他的属性发生变化,因此,该做***导致产生稀松数组,所以不推荐使用该做法。

数组.pop(): 删除数组的最后一项,该表达式返回最后一项的数据

数组.shift():删除数组第一项,该表达式返回第一项的数据

数组.splice(下标, 删除的数量, 添加的数据): 从指定下标位置开始,删除指定数量,然后在该位置插入添加的数据,如果下标超过范围,则按照范围的边界进行处理。返回一个新数组,该数组记录被删除的数据。

106、var a = parseInt([0,0,1,0,0].join('')+1)

//join()方法将数组转为字符串,并用指定的分隔符进行分割$3.join("") 后变成字符串'00100'

字符串'00100'+1 ,1是number,会将1转变为字符串后拼接

就变为 001001  parseInt后 变成 1001

107、下面几个都会转化为0:

Number()

Number(0)

Number('')

Number('0')

Number(false)

Number(null)

Number([])

Number([0])

108、Object.is(a1,a2),与a1===a2两点不同

Object.is(NaN,NaN);//true

NaN === NaN ;//false

Object.is(+0,-0);//false

+0 === -0 ;//true

109、Number、String、Null、Undefined、Symbol、Boolean

用typeof可以检测出变量的基本数据类型,但是有个特例,就是null的typeof返回的是object,这是个javascript的历史bug。

110、本题的3个考点,搞懂这三点,应该不会出错了。

(1)foreach的回调函数的三个参数的意义。

  value(必须)是数组元素的值;index(可选)是数组元素的下表;array(可选)是数组本身。

(2)自加运算符的运算顺序。

  a++:先赋值,再自加

  ++a:先自加,再赋值

  (3)  除了抛出异常以外,没有办法中止或跳出 forEach() 循环。(摘自MDN)

  所以,即使有return,还是会执行完所有回调

111、首先0xff表示16进制的ff, 即16*15+16 = 255

^: 表示的是异或运算符

33就是十进制的33 ,

现在将它们两个2进制化表达就是:

0xff ----> 255 ----> 1111  1111

33  ----> 33  ----> 0010 0001

这两个进行异或运算后是

                              1101 1110 (二进制)

二进制的1101 1110 转换为10进制就是:128+64+0+16+8+4+2+0 = 222

112、Math.max()  只能接受一个个number的值作为参数,不能传入数组。可是Math.max.apply(Math,arr)  这样就可以使用数组了。

113、空数组为true,空字符串为假

114、function fn(){

        console.log(1);

      }

      console.log(typeof []);//object

      console.log(typeof '[]');//string

      console.log(typeof 1);//number

      console.log(typeof true);//boolean

      console.log(typeof null);//object

      console.log(typeof undefined);//undefined

      console.log(typeof {id:2});//object

      console.log(typeof fn);//function

115、构造方法中get set 要一起使用

116、BOM浏览器对象模型的内置对象:

1)window对象:BOM的核心对象是window,它表示浏览器的一个实例,它也是ECMAScript规定的Globle对象。

2)  location对象:url地址相关的,常见属性有hash,protocal,host,hostname,pathname,port,search,href

3)  history对象:存储最近访问过的网址列表(即历史访问记录),多用于操作浏览器的"前进"和"后退"。

4)  navigator对象: 通过这个对象可以获得浏览者的浏览器的种类、版本号等属性。

5)  screen对象:用于存储浏览者系统的显示信息,如屏幕的分辨率、颜色深度等。

location,history,navigator,screen都在window对象下

117、javascript中实现跨域的方式总结

第一种方式:jsonp请求;jsonp的原理是利用标签的跨域特性,可以不受限制地从其他域中加载资源,类似的标签还有.

第二种方式:document.domain;这种方式用在主域名相同子域名不同的跨域访问中

第三种方式:window.name;window的name属性有个特征:在一个窗口(window)的生命周期内,窗口载入的所有的页面都是共享一个window.name的,每个页面对window.name都有读写的权限,window.name是持久存在一个窗口载入过的所有页面中的,并不会因新页面的载入而进行重置。

第四种方式:window.postMessage;window.postMessages是html5中实现跨域访问的一种新方式,可以使用它来向其它的window对象发送消息,无论这个window对象是属于同源或不同源。

第五种方式:CORS;CORS背后的基本思想,就是使用自定义的HTTP头部让浏览器与服务器进行沟通,从而决定请求或响应是应该成功还是应该失败。

第六种方式:Web Sockets;web sockets原理:在JS创建了web socket之后,会有一个HTTP请求发送到浏览器以发起连接。取得服务器响应后,建立的连接会使用HTTP升级从HTTP协议交换为web sockt协议。

118、eval 将会返回对最后一个表达式的求值结果。

119、框架都是基于原生js写的

120、Math.round(11.5)=12,Math.round(-11.5)=-11,两者相加为1;

121、^abc$  匹配开头是a,结尾是c,开头和结尾中间有一个b,所以只能匹配abc一个

^[abc]$  匹配中括号[]里面的一个字母,而且以这个字母开始,以这个字母结尾,所以只能匹配上a,b或者c,共三个

^[abc][1,2]$匹配以abc的一个字母开始,以1或2结尾的,组合一下可知有a1,a2,b1,b2,c1,c2;共六个

^[abc]{2}$匹配abc随便组成的两个字母,有aa,ab,ac,ba,bb,bc,ca,cb,cc;共九个

122、主要是局部变量和全局变量的差异,var a=b=3;相当于var a,b=3,即a为局部变量,b为全局变量

123、以下是四种touch事件

touchstart:    //手指放到屏幕上时触发

touchmove:      //手指在屏幕上滑动式触发

touchend:    //手指离开屏幕时触发

touchcancel:    //系统取消touch事件的时候触发,这个好像比较少用

每个触摸事件被触发后,会生成一个event对象,event对象里额外包括以下三个触摸列表

touches:    //当前屏幕上所有手指的列表

targetTouches:      //当前dom元素上手指的列表,尽量使用这个代替touches

changedTouches:    //涉及当前事件的手指的列表,尽量使用这个代替touches

124、import用于引入css,js暂未发现这种用法。

125、1、考的是变量提升,let不存在变量提升,for循环中定义的变量并不能在外部访问,所以在外部访问 i 就会报“ i is not defined”, 如果 let 换成 var 输出的也只能是 12 不可能是 11。

2、考的是const的特性,const是常量,一经定义不能被重新赋值,所以会报错“Uncaught TypeError: Assignment to constant variable.”

3、这题和上面一题有区别,区别就在于这里定义的 g 为一个引用类型,常量 g 中存储的只是对象的引用地址,所以修改对象中的值并不会造成语法报错,而是可以正常输出。

126、此题分为两点:(JS中)

    1.对象类型转换为布尔类型结果为true,并且只有0,-0,NaN,null,undefined,“”“这个6个值转换为布尔值时,结果为false。

    2.new Boolean(false)和Boolean(0)是不一样的,有new的就创建一个布尔类型的对象,没有new的是类型转换。

127、注意:

1. x++ 和++x的区别,x++是先计数再加1,从0开始;++x是先运算再计数,从1开始。

2. case中没有break,程序会接着往下走。

128、$(父元素).append(子元素),$(子元素).appendTo(父元素)

129、立即执行的函数表达式中this指向全局也就是window

130、js是一门解释性的语言

  编译性语言

  只须编译一次就可以把源代码编译成机器语言,后面的执行无须重新编译,直接使用之前的编译结果就可以;因此其执行的效率比较高;

  解释性语言

  程序在运行时才翻译成机器语言,每执行一次都要翻译一次;

js是一门脚本语言

js是一门弱类型语言,

  强类型语言是一种强制类型定义的语言,即一旦某一个变量被定义类型,如果不经强制转换,那么它永远就死该数据类型。而弱类型语言是一种弱类型定义的语言,某一个      变量被定义类型,该变量可以根据环境变化自动进行转换,不需要经过现行强制转换。

  强类型语言和弱类型原因其判断的根本是是否会隐形进行语言类型转变。

js是一门基于对象的语言

js不是面向对象的语言,但是可以模拟面向对象的思想

js是一门动态类型的语言:

  动态类型语言:动态性语言是指在运行期间才去做数据类型检查的语言,也就是说动态类型语言编程时,永远不用给任何变量指定数据类型,该语言会在第一次赋值给变量时,在内部将数据类型记录下来。

  静态类型语言:静态类型语言与动态类则刚好相反,它的数据类型在编译期间检查,

对于动态语言与静态语言的区分,其根本在于判断是在运行期间去做数据类型还是在编译期间检查。

131、立即执行函数,执行完毕后会立即销毁,所以立即执行函数内部的变量b就被回收了,但是全局变量b不会被回收

132、slice不改变原数组,返回截取的数组,slice(start,end),splice改变原数组splice(start,how many,element1,…)

133、typeof  1; //'number'

typeof (1);//'number'

typeof (); //SyntaxError 语法错误

void  0; //undefined

void (0);//undefined

void (); //SyntaxError 语法错误

134、enum是TS中的枚举,不是JS的类型级扩展。

135、commonJS四个重要环境变量:require、exports、module、global

136、首先区分浏览器端和服务器端的js模块化规范。

1)浏览器端的js模块化规范:AMD 和 CMD

2)服务器端的js模块化规范:CommonJS(注:由NodeJS实现)

第二:浏览器端的js模块化规范分别由什么实现。

1)AMD是由require.js实现的(记忆法,认为A是Async异步, 依赖前置,就是所有的依赖必须放在最前面)

2)CMD是由sea.js实现的(依赖就近,所有依赖需要了再引入)

137、orEach(), filter(), reduce(), every() 和some()都会跳过空位。

map()会跳过空位,但会保留这个值

join()和toString()会将空位视为undefined,而undefined和null会被处理成空字符串。

ES6 中都会将空位当做undefined

138、在jsx里面,要把class换成className才能正确编译

139、判断一个js对象(arr)是否是Array,最准确的方法:Object.prototype.toString.call(arr)=== '[object Array]'

140、angular js中control间通信最好使用广播的方式

141、var a = 100;

function a(){}

a();

就这样都是报错,大概是重名了吧,而且函数提升到前,变量声明在后,所以把a变量当成函数调用了,所以报错:a is not a function,a不是一个函数

142、摘抄自MDN

delete() delete 操作符用于删除对象的某个属性

var, let以及const创建的不可设置的属性不能被delete操作删除

不可配置属性configurable

当且仅当该属性的 configurable 为 true 时,该属性描述符才能够被改变,同时该属性也能从对应的对象上被删除。默认值为true。

ES6以后除了全局对象以外还维护了一个变量名列表,专门用来存储var,let,const声明的变量,并且约定了该列表里面的变量不能被delete删除,所以a变量无法被删除。

尽管var a =1;b =2 都是全局变量,都可以通过全局对象访问到。但b不是var声明的,可被delete删除,因此访问不了

eval中声明var变量是唯一一个被添加到变量名列表同时也可以被delete删除的特例,所以删除变量c有效。

143、原生具备 Iterator 接口的数据结构如下:

Array

Map

Set

String

TypedArray

函数的 arguments 对象

NodeList 对象

144、call/apply用来改变函数的执行上下文(this),它们的第一个参数thisArg是个对象,即作为函数内的this。有两种情况需要注意,传null或undefined时,将是JS执行环境的全局变量。浏览器中是window,其它环境(如node)则是global。

145、“与 var 关键字不同,使用 let 在全局作用域中声明的变量不会成为 window 对象的属性(var 声明的变量则会)” ---《JavaScript 高级程序设计》

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

蹦卡啦撒卡玛卡

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值