面试题笔记

JS

1:JS中使用typeof能得到哪些类型
以下为小栗子

  typeof undefined  //undefined
  typeof 'abc' //string
  typeof 123 //number
  typeof true //boolean
  typeof {}  //object
  typeof [] //object
  typeof null //object
  typeof console.log //function

2.何时使用=== 何时使用==

可以回答只有下面这种情况使用==,其余情况都使用===

if(obj.a == null) {
  //这里相当于obj.a === null || obj.a === undefined  简写形式
  //这是jquery源码中推荐的写法
}

3.JS中有哪些内置函数(搭配1使用更佳)
Object
Array
Boolean
Number
String
Function
Date
RegExp
Error

4.JS变量按照储存方式区分为哪些类型,并描述其特点

//值类型
var a = 10;
var b = a;
a = 11;
console.log(b);    // 10

----------
//引用类型   指向的是一个地址,地址里面的内容发生改变的时候,引用的对象的内容也会发生改变
var a = {x:100};
var b = a;
a.x = 200;
console.log(b.x);    // 200

5.如何理解JSON
json只不过是一个js对象而已,同时也是一种数据格式
下面是常用的两个api

JSON.stringify({a:10,b:20})  //把对象变成字符串
JSON.parse('{a:10,b:20}')  //把字符串变成对象

如何判断一个变量是否是数组

变量 instanceof Array

//例如
var a = []
a instanceof Array //true

//使用typeof的话是不行的
typeof a //"object"

5条原型规则

1.所有的引用类型(数组,对象,函数),都具有对象特性,即可自由扩展属性(除了“null”)

var obj = {}; obj.a =100; //扩展出a属性
var arr= []; arr.a =100; 
function fn(){}; fn.a = 100;

2.所有的引用类型(数组,对象,函数),都有一个 _proto_ 属性(隐式原型),属性值是一个普通的对象

var obj = {};
console.log(obj._proto_); 
//{constructor: ƒ, __defineGetter__: ƒ, __defineSetter__: ƒ, hasOwnProperty: ƒ, __lookupGetter__: ƒ, …}

3.所有的函数,都有一个 prototype 属性(显式原型),属性值也是一个普通的对象

function fn(){};
console.log(fn.prototype);
//{constructor: ƒ}     //输出的这个可以展开,上面的2也是

4.所有的引用类型(数组,对象,函数), _proto_ 属性值指向它的构造函数的“prototype”属性值

var obj = {}
console.log(obj.__proto__ === Object.prototype) 
 //true

5.当试图得到一个对象的某个属性时,如果这个对象本身没有这个属性,那么会去它的_proto_(即它的构造函数的prototype)中寻找

var Foo = function(name,age){this.name = name;}
Foo.prototype.alertName = function(){ alert(this.name)}
//ƒ (){ alert(this.name)}
var d = new Foo('zhangsan');
d.printName = function(){console.log(this.name)}
//ƒ (){console.log(this.name)}
d.printName()
//zhangsan
d.alertName()    //本来d上面是没有alertName这个属性的,不过因为d的隐式原型属性等于d的构造函数的显式原型,所以显式原型上面的alertName就会赋予到d上面,所以会显示zhangsan
//页面上弹出zhangsan

额外知识点______连接上面的代码

var item;
for(item in d) {
 //高级浏览器已经在for in 中屏蔽了来自原型的属性(即上面的alertName)
 //但是建议还是加上判断,保证程序的健壮性
 if (d.hasOwnPrototype(item)){
    console.log(item)
}
}
//最后打印出来的只有下面的属性
//name
//printName

描述new一个对象的过程

function Foo(name,age){
  this.name = name;
  this.age = age;
  this.class = 'class-1'
}
var f = new Foo("zhangsan",99);