JS基础知识

227 阅读2分钟

数据类型与类型转换,运算

  • 原始类型:
  • 6种原始类型: Undefined,null, Boolean,number, string
  • Es6: symbol
  • 引用类型:Object
  • typeof运算符返回值:undefined, boolean,number, string, object, symbol
  • 类型转换
  • 转换成数字:parseInt, parseFloat,Number, ~~,+,

  • 转换为boolean:!!, Boolean 【0, ‘’,null, undefined, NaN 转换为boolean值是false, 其余情况(对象,数组)为true】
  • 比较运算符
  • ==(比较之前进行类型转换)和=== (!= 和 !==)
  1. 如果一个操作值为布尔值,则在比较之前先将其转换为数值
  2. 如果一个操作值为字符串,另一个操作值为数值,则通过Number()函数将字符串转换为数值
  3. 如果一个操作值是对象,另一个不是,则调用对象的valueOf()方法,得到的结果按照前面的规则进行比较
  4. null与undefined是相等的
  5. 如果一个操作值为NaN,则相等比较返回false
  6. 如果两个操作值都是对象,则比较它们是不是指向同一个对象
  • 字符串

  • Contract, indexOf,lastIndexOf, match, replace, search, slice, split, substr, substring, toLowerCase, toUpperCase, fontcolor() 等 charAt,charCodeAt, fromCharCode, es6.ruanyifeng.com/#docs/strin…

  • Array
    concat(), join(),pop(),push(),reverse(),shift(),slice(), sort(),splice(),toSource(),toString(),toLocaleString(),unshift(),valueOf()

  • 2个索引方法:indexOf() 和 lastIndexOf();

  • 5个迭代方法:forEach()、map()、filter()、some()、every();

  • 2个归并方法:reduce()、reduceRight();

es6.ruanyifeng.com/#docs/array…

Object

function deepCopy(p, c) {
    var c = c || {};
    for (var i in p) {
		console.log(i)
		if(p.hasOwnProperty(i)){
			if (typeof p[i] === 'object') {
          c[i] = (p[i].constructor === Array) ? [] : {};
          deepCopy(p[i], c[i]);
        } else {
          c[i] = p[i];
        }
		}
    }
	return c;
}
  • 属性定义
    Object.defineProperty(obj, prop, descriptor) 参数:

obj:目标对象
prop:需要定义的属性或方法的名字。
descriptor:目标属性所拥有的特性。
可供定义的特性列表:
value:属性的值
writable:如果为false,属性的值就不能被重写。
get: 一旦目标属性被访问就会调回此方法,并将此方法的运算结果返回用户。
set:一旦目标属性被赋值,就会调回此方法。
configurable:如果为false,则任何尝试删除目标属性或修改属性以下特性(writable, configurable, enumerable)的行为将被无效化。
enumerable:是否能在for...in循环中遍历出来或在Object.keys中列举出来。

www.cnblogs.com/mopagunda/p…

  • Call
Array.prototype.slice.call({0:1, 1:2, 2:3,length:5})
  • Apply
var a = [10, 2, 4, 15, 9];
Math.max.apply(null, a);
  • Bind
    -- bind方法用于将函数体内的this绑定到某个对象,然后返回一个新函数
    -- bind比call方法和apply方法更进一步的是,除了绑定this以外,还可以绑定原函数的参数
var add = function (x,y) {
  return x*this.m + y*this.n;
}
var obj = {
  m: 2,
  n: 2
};
var newAdd = add.bind(obj, 5);
newAdd(5)
// 20

函数的继承

function Person(name, sex) {
    this.name = name;
    this.sex = sex;
}
Person.prototype.abc = 'abc';
function Teacher(name, sex, category){
	Person.call(this, name, sex);
	this.category = category;
}

Teacher.prototype = Object.create(Person.prototype);
Teacher.prototype.constructor = Teacher;
var aTeacher = new Teacher(1,2,3);
  
  
Object.defineProperty(aTeacher, 'is', {  
  value:false,
  configurable: true,
  enumerable: false,
  writable: true 
})

//console.log('Teacher', aTeacher)
console.log(Object.getOwnPropertyNames(aTeacher))
console.log(Object.keys(aTeacher))
console.log(Object.keys(Teacher))
var copyTeacher =  _.cloneDeep(aTeacher);
//console.log('Teacher', Object.keys(Teacher))
console.log('copyTeacher', Object.keys(copyTeacher))

console.log('hasOwnProperty', aTeacher.hasOwnProperty('abc'))
console.log('aTeacher.__proto__: ' , aTeacher.__proto__);  //Person 
console.log('Teacher.prototype: ' , Teacher.prototype);  //teacher1.__proto__ == Teacher.prototype
console.log('aTeacher.constructor: ' , aTeacher.constructor);
console.log('Teacher.prototype.constructor: ',  Teacher.prototype.constructor);  //teacher1.constructor == Teacher.prototype.constructor
//console.log('copyTeacher', copyTeacher)
//console.log('Person', Object.keys(Person.prototype))

var copyTeacher2 = {}
deepCopy(aTeacher, copyTeacher2);
console.log(copyTeacher2)

jsbin.com/sefehasoli/… es6.ruanyifeng.com/#docs/class…

Function

Set, Map, WeakSet, WeakMap

Set数据唯一 WeakSet, WeakMap不可遍历

Cookie

  • Localstorage Sessionstorage:

正则表达式

事件模型

For in ./ for of