函数

  • call: fun.call(a), a会转化成相应的对象,函数内的this即指向它;
function foo() {
console.log(this);
}
foo.call(null); //window
foo.call(undefined); //window

this

函数中this绑定

  • call-site: 函数的发起方
  • call-stack: 函数的执行栈
  • 如果函数没有明确的发起方,则其this有一个默认的绑定:全局
  • 在"use strict"模式下,如果函数的执行栈在该模式范围下,不会有默认的this绑定;否则没影响;
  • 隐性地失去绑定:因为真实的call-site不是原引用对象;
function foo() {
console.log( this.a );
} var obj = {
a: 2,
foo: foo
}; var bar = obj.foo; // function reference/alias! var a = "oops, global"; // `a` also property on global object bar(); // "oops, global" ...........
function foo() {
console.log( this.a );
} function doFoo(fn) {
// `fn` is just another reference to `foo` fn(); // <-- call-site!
} var obj = {
a: 2,
foo: foo
}; var a = "oops, global"; // `a` also property on global object doFoo( obj.foo ); // "oops, global"
setTimeout( obj.foo, 100 ); // "oops, global" 原生自带的也是一样
  • 强行绑定:call, apply, bind和其他js内建的高级函数的参数定义上下文
function foo(el) {
console.log( el, this.id );
} var obj = {
id: "awesome"
}; // use `obj` as `this` for `foo(..)` calls
[1, 2, 3].forEach( foo, obj ); // 1 awesome 2 awesome 3 awesome //第二参数传入
  • 当既有绑定又有new操作符的时候
function foo(p1,p2) {
this.val = p1 + p2;
} // using `null` here because we don't care about
// the `this` hard-binding in this scenario, and
// it will be overridden by the `new` call anyway!
var bar = foo.bind( null, "p1" ); var baz = new bar( "p2" ); baz.val; // p1p2
  • 总结
//有new操作符的时候,this指代newly constructed object;
//有绑定上下文的时候,指代绑定的上下文;
//当是对象方法的时候,指代那个对象
//默认情况下指代全局对象或者undefined(use strict)

属性

括号方式访问对象

  • 属性名都是字符串类型,不是字符串也会强制转化成字符串
var myObject = { };

myObject[true] = "foo";
myObject[3] = "bar";
myObject[myObject] = "baz"; myObject["true"]; // "foo"
myObject["3"]; // "bar"
myObject["[object Object]"]; // "baz"

给对象添加属性

  • 注意数值字符串会隐式转化为数值
var myArray = [ "foo", 42, "bar" ];

myArray["3"] = "baz";

myArray.length; // 4

myArray[3];     // "baz"

对象复制

  • 简单的方法
var newObj = Object.create(someObj );
var newObj = JSON.parse(JSON.stringify( someObj));

对象枚举

  • 设置对象属性非枚举
var myObject = { };

Object.defineProperty(
myObject,
"a",
{ enumerable: true, value: 2 }
); Object.defineProperty(
myObject,
"b",
{ enumerable: false, value: 3 }
); for (var k in myObject) {
console.log( k, myObject[k] );
} // "a" 2 Object.keys( myObject ); // ["a"]

constructor和prototype

constructor

  • 它是由当前对象所引用的[[Prototype]]所决定
function Foo() { /* .. */ }
Foo.prototype.constructor === Foo Foo.prototype = { /* .. */ }; // create a new prototype object var a1 = new Foo();
a1.constructor === Foo; // false!
a1.constructor === Object; // true! //[[Prototype]]实际是指向Object.prototype
Foo.prototype.constructor === Object

正则表达式

重复出现

?   可选 (添加后变非贪婪模式)
+ 一次或多次
* 0次或多次
{n}
{n,}
{,m}
{n,m}

反向引用

() 分组和捕获
[] 或操作符
/^([dtn])a\1/ \n表示匹配要引用的捕获数量

js整理3的更多相关文章

  1. Dynamics CRM 日常使用JS整理(二)

    BPF(Business Process Flow)相关的JS 为Stage添加changed或者selected事件: function fnOnLoad() { Xrm.Page.data.pro ...

  2. Dynamics CRM 日常使用JS整理(一)

    整理下平时CRM开发中用到的一些基本的js操作 取值: var oResult = Xrm.Page.getAttribute(sFieldName).getValue(); var oResult ...

  3. js整理

    Js脚本语音 网页里面使用的脚本语音 基础语法 注释语法  单行注释// 多行注释/**/ 嵌入js代码  尽量靠下写  用<script type="text/javascript& ...

  4. Vue.js 整理笔记

    以前我们用Jquery进行dom的操作,虽然熟悉后开发效率很高,但是如果多个控件的相互操作多的情况下,还是会乱.相比之下,Vue的使用更加清晰,通过虚拟dom将数据绑定,而且组件化和路由的帮助下,让整 ...

  5. js整理1

    数组 比较时的隐式转化 var a = [1,2,3]; var b = [1,2,3]; a == b; //false a == '1,2,3'; //true; // var c = []; B ...

  6. node.js整理 07例子

    需求 一个简单的静态文件合并服务器,该服务器需要支持类似以下格式的JS或CSS文件合并请求. http://assets.example.com/foo/??bar.js,baz.js 在以上URL中 ...

  7. node.js整理 06异步编程

    回调 异步编程依托于回调来实现,但不能说使用了回调后程序就异步化了 function heavyCompute(n, callback) { var count = 0, i, j; for (i = ...

  8. node.js整理 05进程管理

    简介 NodeJS可以感知和控制自身进程的运行环境和状态,也可以创建子进程并与其协同工作,这使得NodeJS可以把多个程序组合在一起共同完成某项工作,并在其中充当胶水和调度器的作用 常用API Pro ...

  9. node.js整理 03文件操作-遍历目录和文本编码

    遍历目录 递归算法 遍历目录时一般使用递归算法,否则就难以编写出简洁的代码. 递归算法与数学归纳法类似,通过不断缩小问题的规模来解决问题 function factorial(n) { if (n = ...

随机推荐

  1. 用户登录流程详解 +volley(StringRequest)

    在实习期间由于要求使用volley,所以第一次开始接触volley,从一开始的迷茫陌生,到疯狂的查找各种资料,通过在项目中用到的实际问题,我想做一些总结,所以写了这篇文章.下面我将介绍我理解的用户登录 ...

  2. JavaScript for循环里边异步操作问题。

    问题:(DRIVING.search是异步操作) for循环中做异步操作会导致aDistances数组里边的数据全部都是从A_SHOP_INFO数组中最后一条数据获取的值. var iIdx = 0; ...

  3. 真机测试无缘无故finish了。程序也没有启动

    去钥匙串里边把多余的证书删除, 然后reset xcode - preference - 选中你的appleID - iOS Development  -  reset

  4. java获取客服端信息(系统,浏览器等)

    String agent = request.getHeader("user-agent"); System.out.println(agent); StringTokenizer ...

  5. .NET微信公众号开发-1.0初始微信公众号

    一.前言 微信公众号是开发者或商家在微信公众平台上申请的应用账号,该帐号与QQ账号互通,通过公众号,商家可在微信平台上实现和特定群体的文字.图片.语音.视频的全方位沟通.互动 .形成了一 种主流的线上 ...

  6. July 7th, Week 28th Thursday, 2016

    The 79th Anniversary of Anti-Japan War Difficulties vanish when faced bodly. 勇敢面对困难,困难自会退让. The best ...

  7. JNDI 和JDBC的区别

    1.JNDI 和JDBC的区别和联系.两者都是API,是一个标准.并不是什么产品或方法.JDBC 全称:Java Database Connectivity 以一种统一的方式来对各种各样的数据库进行存 ...

  8. LeetCode : 223. Rectangle Area

    aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAABRQAAAQ0CAYAAAAPPZBqAAAMFGlDQ1BJQ0MgUHJvZmlsZQAASImVlw

  9. 设计模式之构建者模式(Builder):初步理解

    构建者(Builder)设计模式(又叫生成器设计模式): 当一个类的内部数据过于复杂的时候(通常是负责持有数据的类,比如Config.VO.PO.Entity...),要创建的话可能就需要了解这个类的 ...

  10. 20145206《Java程序设计》第9周学习总结

    20145206 <Java程序设计>第9周学习总结 教材学习内容总结 第十六章 整合数据库 JDBC是用于执行SQL的解决方案,开发人员使用JDBC的标准接口,数据库厂商则对接口进行操作 ...