我爱编程

第二章 js基础知识上

2018-05-21  本文已影响0人  qqqc

2-1 变量类型和计算

题目

正常情况都是用 ===
if(obj.a ==null){
  // 这里相当于 obj.a === null || obj.a === undefined 的简写形式
  // 这是jq 源码推荐的写法
}
Obiect
Array
Boolean
Number
String
Function
Date
RegExp
Error
// JSON 只是一个js对象
JSON.stringify({a: 10,b:20})
JSON.parse(' {"a": 20, "b": 20} ')

知识点

变量类型

// 值类型
var a = 100
var b = a
a = 200
console.log(b) //100

//引用类型
var a = {age: 20}
var b = a
b.age = 21
console.log(a.age) //
typeof undefined // undefined
typeof 'abc' // string
typeof 123 //numbur
typeof true //boolean
typeof {} //obiect
typeof [] //obiect
typeof null //obiect
typeof console.log // function

变量计算

// 字符串拼接
var a = 100 + 10 //110
var b = 100 + '10' // '10010'

// == 运算符
100 == ‘100’ //true
0 == ' ' // true
null == undefined // true

// if 语句
var a = true
if(a){
  //
}
var b = 100
if(b) {
  //
}
var c  = ' '
if(c){
  //
}

// 逻辑运算符
console.log(10 && 0) //0
console.log(' ' || 'abc') //abc
console.log(!window.abc) // true

//判断一个变量会被当成true还是false
var a = 100
consloe.log(!!a)  //true

2-2 原型和原型链

题目

var arr = []
arr instanceof Array // true
typeof arr //Objeict ,typeof 是无法判断是否是数组
 创建一个新对象
 this 指向这个新对象
 执行代码,即对 this 赋值
 返回 this

知识点

function Foo(name, age){
  this.name = name;
  this.age = agel;
  this.className = 'class-1'
  // return this 默认有这一行
}
var f = new Foo('zhangsan', 18)
var f1 = new Foo('zhangsan1', 18) //创建多个对象
var a = {} 其实是 var a = new Object() 的语法糖
 var a = [] 其实是 var a = new Array() 的语法糖
 function Foo(){...} 其实是 var Foo = new Function(...)
 使用 instanceof 判断一个函数是否是一个变量的构造函数

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

var obj = {}; obj.a = 100;
var arr = []; arr.a =100;
function fn (){}  fn.a = 100;

console.log(obj._proto_);
console.log(arr._proto_);
console.log(fn._proto_);

console.log(fn.prototype);

console.log(obj._proto_ === Object.prototype);

所有的引用类型(数组、对象、函数),都有一个proto属性,属性值是一个普通的对象

console.log(obj._proto_);
console.log(arr._proto_);
console.log(fn._proto_);

所有的函数,都有一个 prototype 属性,属性值也是一个普通的对象

console.log(fn.prototype);

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

console.log(obj._proto_ === Object.prototype);

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

// 构造函数
function Foo(name){
  this.name = name
}

Foo.prototype.alertName = function(){
  alert(this.name)
}
// 创建实例
var f = new Foo('zhangsan');
f.printName = function(){
  console.log(this.name)
}

// 测试
f.printName()
f.alertName()
// 构造函数
function Foo(name){
  this.name = name
}

Foo.prototype.alertName = function(){
  alert(this.name)
}
// 创建实例
var f = new Foo('zhangsan');
f.printName = function(){
  console.log(this.name)
}

// 测试
f.printName()
f.alertName()
f.toString() //要去f._proto_._proto_ 中查找
image.png

f instanceof Foo 的判断逻辑是:
f 的 proto 一层一层往上,能否对应到 Foo.prototype
再试着判断 f instanceof Object

上一篇下一篇

猜你喜欢

热点阅读