面试--js常见面试题

逻辑探幽人
• 阅读 2190

引用文字

1、delete

delete不可以删除变量 只可以删除变量上的属性

2、有名函数被赋值为一个变量

再访问这个 名(有名函数的名)就会报错

  var f=function g() {
        return 1
    }
    console(g())

会报错 g没有被定义

3、函数的this指向谁 决定于是谁在调用它

var foo={
       baz:1,
         bar:function () {
             return this.baz;
         }
     };
     (function () {
            console.log(typeof arguments[0]()) //undefined
     })(foo.bar)

4、分组选择符() 值是括号里边的最后一个

 var a=(1,3,4);
     console.log(a)  //4

5、new一个构造函数 会执行的操作

一个没有返回值的函数在new进行构造调用以后 会返回一个如下所说的对象

                普通调用这个函数  则没有返回值
      
  var foo=function () {
      console.log(11)
  }
  var foo1=new foo();
  var foo2=foo();
  console.log(foo1,foo2)  //foo  undefined

在使用new 对构造函数进行调用的时候 会发生如下几件事情

(1)首先会生成一个空对象
(2)将新建对象的this指针指到新建的对象上
(3)如果构造函数没有返回值 让这个对象的原型指向构造函数的prototype

 如果真个个对象有返回值   让这个对象指向了返回的对象

所以尽量不要在构造函数中返回什么东西

6、函数的形参和是实参的个数

函数.length 可以得到函数的形参的个数
函数中arguments.length可以得到函数实际参数的个数

7、变量的查找是就近原则

去寻找var 定义的变量 当就近没有找到的话 就会查找外层
同时变量声明的过程是 var a=2; 1、变量声明提前 2、再赋值

 var a=10;
   function foo() {
       console.log(a);
       var a=20;
   }
   foo();  //undefined

以上代码和下面的代码是等价的

  var a=10;
   function foo() {
       var a;
       console.log(a);
       a=20;
   }
   foo();  //undefined

8、js中参数传递

普通类型是值传递   引用类型是地址传递    

普通类型 相当于将实参赋值给了形参 实参没有任何的改变

  var a=10;
function foo(a) {
    a+=10;
}
foo(a);
console.log(a)  //10

引用类型 将实参的引用类型的地址 赋值给形参

  var a=[1,3,4,5,6];
function foo(a) {
   a.push(1,3)
}
foo(a);
console.log(a)  //[1, 3, 4, 5, 6, 1, 3]

9 利用正则表达式的子项 和字符串的replace 函数的第二个参数为函数的功能

实现将中画线的字符串 转化为驼峰式命名的字符串

   function aa(str) {
       var partten=/-(\w)/g;
       return str.replace(partten,function ($0,$1) {
           console.log($0,$1)
           //会输出  -c  c  和-s   s
           return $1.toUpperCase()
       })
   }
    console.log(aa("background-color-style"))

10 用递归来代替循环

不使用循环 创建数组

  function test(n) {
       var arr=[];
       return (function () {
           arr.unshift(n);
           n--;
           if(n!=0){
               arguments.callee()
           }
           return arr;
       })()
   }
   console.log(test(5))

用str的replace 来实现循环

  function test(n) {
       var arr=[];
       arr.length=n+1;
       var str="";
       str=arr.join("a");
       var arr2=[];
       str.replace(/a/g,function () {
           arr2.unshift(n--)
       })
       return arr2;
   }
   console.log(test(5))  //[1,2,3,4,5]

11 利用三目运算 switch 来代替if else

12 原型链 对象 构造函数的关系

原型:构造函数在创建的过程中,系统自动创建出来与构造函数相关联的一个空的对象。可以由构造函数.prototype来访问到
每个对象的__proto__属性指向自身构造函数的prototype;
constructor属性是原型对象的属性,指向这个原型对象所对应的构造函数。
每一个原型对象都有consrtructor属性
原型链:每一个对象都有自己的原型对象,原型对象本身也是对象,原型对象也有自己的原型对象,这样就形成了一个链式结构,叫做原型链。
例如:p对象----->Person.prototype------->Object.prototype--------->null 构成原型链
面试--js常见面试题

13、DOM事件的绑定机制。

element.onclick
W3C下使用element.addEveneListener('click',function(),false[在冒泡阶段执行函数])
IE下 使用element.attachEvent('click',function(){}) 这个函数中的this指向的是window而不是element

点赞
收藏
评论区
推荐文章
Karen110 Karen110
3年前
一篇文章带你了解JavaScript作用域
在JavaScript中,对象和函数也是变量。在JavaScript中,作用域是你可以访问的变量、对象和函数的集合。JavaScript有函数作用域:这个作用域在函数内变化。一、本地JavaScript变量一个变量声明在JavaScript函数内部,成为函数的局部变量。局部变量有局部作用域:它们只能在函数中访问。JS://codeherecann
Wesley13 Wesley13
3年前
java中的类与对象(1)
    首先理解一下类和对象的关系,可以说:类是对象的抽象,对象是类的实例。类一个类中,通常上包含了属性和功能。属性通常用变量表达,功能通常上用函数表达。编写一个类class类名{//属性,用变量表达//功能,用函数表达}对象实例化对象的方法及含义:类名 对象名 new 
Wesley13 Wesley13
3年前
java成员变量的初始化
类变量(static变量,不需要实例化对象也可以引用)实例变量(非static变量,需要实例化对象)局部变量(类的成员函数中的变量)初始化方式:构造函数初始化变量声明时初始化代码块初始化java自动初始化(在构造函数执行之前执行) java保证所有变量被使用之前都是经过初始化的(声明并且定义过,被赋值
Jacquelyn38 Jacquelyn38
4年前
重学JavaScript第1集|变量提升
变量提升就好比JavaScript引擎用一个很小的代码起重机将所有var声明和function函数声明都举起到所属作用域(所谓作用域,指的是可访问变量和函数的区域)的最高处。这句话的意思是:如果在函数体外定义函数或使用var声明变量。则变量和函数的作用域会提升到整个代码的最高处,此时任何地方访问这个变量和调用这个函数都不会报错;而在函数体内定义函数或使用va
Andrew703 Andrew703
4年前
Python基础核心概念
1变量和简单数据类型变量命名格式:变量名“赋值”1.1变量使用规范使用变量时,需要遵守一些规则。违反这些规则将引发错误。变量名只能包含数字、字母、下划线。变量名不能以数字开头以及不能包含空格。变量名不能将Python保留字和函数名作为变量名。如print等如下是python3的33个保留字列表:
Wesley13 Wesley13
3年前
JS 闭包(内存溢出与内存泄漏)(垃圾回收机制)
1.有关闭包定义闭包是指有权访问另一个函数作用域中变量的函数,创建闭包的最常见的方式就是在一个函数内创建另一个函数,通过另一个函数访问这个函数的局部变量闭包的特性:函数内再嵌套函数内部函数可以引用外层的参数和变量参数和变量不会被垃圾回收机制回收
Wesley13 Wesley13
3年前
C++学习_从C到C++
一、引用的概念和应用 1.引用的概念下面写法定义了一个引用,并将其初始化为引用某个变量。类型名&引用名某变量名;intn4;int&rn;//r引用了n,r的类型是int&某个变量的引用,等价于这个变量,相当于该变量的一个别
Stella981 Stella981
3年前
JavaScript原型和原型链——构造函数
一、instanceof:判断引用类型(数组、对象、函数)的变量是由哪一个 构造函数派生出来的。(oinstanceofObject)二、原型规则和示例  1、所有的引用类型(数组、对象、函数),都具有对象特性,可以自由扩展属性(除了"null“以外)。  2、所有的引用类型(数组、对象、函数),都具有\_\_p
Wesley13 Wesley13
3年前
ES6 对象增强
  对象字面量语法扩展:  1, 属性初始化语法简写:给一个属性赋一个变量值,如果变量名和属性名相同,可以省略变量名和冒号,直接写属性名,js引擎在执行代码的时候,自动查找 和属性命名相同的变量并赋值。!复制代码(https://oscimg.oschina.net/oscnet/414cf48b53ba46e84b673583a
Wesley13 Wesley13
3年前
Java连载7
一、变量1.注意点:在同一个“作用域”中,变量名不能重名,但是变量可以重新赋值。2.什么是作用域?答:描述的是变量的有效范围,在范围之内是可以被访问的,只要出了作用域就无法访问(也就是在大括号里面才行)3.关于变量的分类(1)局部变量:在方法体中声明的变量;(2)成员变量:在方法体外声明的变量。4.在不同的作用域中,变量名是可
Wesley13 Wesley13
3年前
ES6模块化注意点
ES6的模块自动采用严格模式,不管你有没有在模块头部加上"usestrict";。严格模式主要有以下限制。变量必须声明后再使用函数的参数不能有同名属性,否则报错不能使用with语句不能对只读属性赋值,否则报错不能使用前缀0表示八进制数,否则报错不能删除不可删除的属性,否则报错