Javascript

创建对象

1.new 构造函数形式
2.Object.create形式

定义类继承

有原型链法、属性复制法和构造器应用法等。

作用域
大多数语言里边都是块作作用域,以{}进行限定。而js里边是函数作用域,一个变量在函数内前后都有效,例如变量p1在函数最后一行定义,在第一行也有效,但是其值是undefined。
全局变量若在函数内被重定义,则在函数内外的变量互不影响。
https://blog.csdn.net/dome_/article/details/79205210

apply、call和bind
三者都可以把一个函数应用到其他对象上。apply、call是直接执行函数调用,bind是绑定,执行需要再次调用。apply和call的区别是apply接受数组作为参数,而call是接受逗号分隔的无限多个参数列表。

    function Person() {
    }
    Person.prototype.sayName() { alert(this.name); }
    var obj = {name: 'michaelqin'}; // 这是另一个普通对象,它不是Person的实例。

    1) apply
    Person.prototype.sayName.apply(obj, [param1, param2, param3]);
    2) call
    Person.prototype.sayName.call(obj, param1, param2, param3);
    3) bind
    var sn = Person.prototype.sayName.bind(obj);    
    sn([param1, param2, param3]); // bind需要先绑定,再执行 
    sn(param1, param2, param3); // bind需要先绑定,再执行

caller、callee和arguments
caller、callee是调用与被调用的关系,就像是employer和employee(雇主和雇员)之间的关系。二者返回的都是函数对象引用。arguments是函数的所有参数列表,是一个类数组的变量。

    function parent(param1, param2, param3) {
        child(param1, param2, param3);
    }

    function child() {
        console.log(arguments); // { '0': 'mqin1', '1': 'mqin2', '2': 'mqin3' }
        console.log(arguments.callee); // [Function: child]
        console.log(child.caller); // [Function: parent]
    }

    parent('mqin1', 'mqin2', 'mqin3');

闭包
所有函数都是闭包.通俗的说闭包就是作用域范围,因为js是函数作用域,所以函数就是闭包。闭包的应用是在内嵌函数,这涉及到内嵌作用域,或者叫作用域链。内嵌就是父子引用关系(父函数包含子函数,子函数因为函数作用域又引用父函数,所以叫闭包),这就会带来另外一个问题,什么时候引用结束?如果不结束,就会一直占用内存引起内存泄漏。不用的时候把引用设为空,死结就解开了。

Object的方法
Object.defineProperty(obj, prop, descriptor)用来给对象定义属性,有value,writable,configurable,enumerable,set/get等。
hasOwnProerty用于检查某一属性是不是存在于对象本身,继承自的父亲的属性不算。
isEnumerable用来检测某一属性是否可遍历,也就是能不能用for..in循环来取到。

常用设计模式在js中的实现思路,利用eval等方法。

判断对象类型

#判断是Buffer
Object.prototype.toString.call(obj1) === '[object Uint8Array]'
#判断是Array
Object.prototype.toString.call(obj1) === '[object Array]'

JS判断字符串结尾

  String.prototype.endWith=function(endStr){
      var diff=this.length-endStr.length;
      return (diff>=0 && this.lastIndexOf(endStr)==diff)
  }

ES6中export及export default的区别:
但在一个文件或模块中,export、import可以有多个,export default仅有一个。
对于export default,导入的时候没有花括号;对于export,导入的时候有花括号;
http://blog.csdn.net/zhou_xiao_cheng/article/details/52759632

遍历对象

for (var key in obj){
      var value=obj[key];
    }

触发其它元素的点击

//IE浏览器
if(document.all) {
document.getElementById("clickme").click();
}
//其它浏览器
else {
var e = document.createEvent("MouseEvents");
e.initEvent("click", true, true);
document.getElementById("clickme").dispatchEvent(e);
}

MDN : Mozilla 开发者网络学习平台
https://developer.mozilla.org

slice与splice的区别
slice() 选取数组的的一部分,并返回一个新数组。
splice() 从数组中添加或删除元素。

数组

#插入元素 array.splice(pos, length, object);
#插入元素到数组头
array.splice(0, 0, “three”);
清空数组
array.length=0;
克隆数组
var clone = myArray.slice(0);

日期时间

var datetimeMonthAgo=new Date(new Date().getTime()-30*24*60*60*1000).toISOString();

合并对象

Object.assign(target, …sources),返回target。

正则

var reg = /url=\”(.*?)\”/g;
var arr = str.match(reg);//得到整个reg匹配的内容
var arr = reg.exec(data.value);//得到reg匹配的内容和子内容
str=arr[1].replace(/&/g,””);//使用正则做全部替换

Post提交方式下载文件
https://blog.fedepot.com/postti-jiao-fang-shi-xia-zai-wen-jian/

发表评论