本文首发在我的个人博客:http://muyunyun.cn/ <你不知道的JavaScript>系列丛书给出了很多颠覆以往对JavaScript认知的点, 读完上卷,受益匪浅,于是对其精华的知识点进行了梳理. 什么是作用域 作用域是一套规则,用于确定在何处以及如何查找变量. 编译原理 JavaScript是一门编译语言.在传统编译语言的流程中,程序中一段源代码在执行之前会经历三个步骤,统称为"编译". 分词/词法分析 将字符串分解成有意义的代码块,代码块又称词法单元.比如…
作用域是什么 编译原理 分词/词法分析 这个过程会将由字符组成的字符串分解成(对编程语言来说)有意义的代码块,这些代码块被称为词法单元 解析/语法分析 词法单元流(数组)转换成一个由元素逐级嵌套所组成的代表了程序语法结构的树(抽象语法树AST) 代码生成 将AST转换为可执行代码的过程称被称为代码生成 理解作用域 处理成员 引擎--负责代码编译和执行 编译器--词法-语法-代码生成 作用域--根据名称查找变量的一套规则 引擎查询(代码执行前) 一个赋值操作的LHS(左侧)和RHS(右侧)查询 v…
 原文:你不知道的js系列 JavaScript 的 this 机制并没有那么复杂 为什么会有 this? 在如何使用 this 之前,我们要搞清楚一个问题,为什么要使用 this. 下面的代码尝试去说明 this 的使用动机: function identify() { return this.name.toUpperCase(); } function speak() { var greeting = "Hello, I'm " + identify.call( this ); c…
划重点 本篇笔者将重点介绍JavaScript中 getOwnPropertyNames .Object.keys.for ... in 的使用及他们之间的异同点. getOwnPropertyNames Object.getOwnPropertyNames()方法返回一个由指定对象的所有自身属性的属性名(包括不可枚举属性但不包括Symbol值作为名称的属性)组成的数组. 那么啥叫自身属性呢?请看下面代码段: var obj = {     a: '1',     b: '2' } var ne…
一.数组对象 1.创建方式 1)创建方式一 var arr=[1,2,3]; 2)创建方式二 var arr2=new Array(1,2,3); 注意: 数组中可以存储任何数据类型.方法类型(Java则必须相同): 如果采用初始化对象方式创建数组,如果里面只有一个值而且是个数字,那么数字表示的是数组长度,而不是内容: 数组是可变长的 var arr4=new Array(3);  //表示定义了占了三个位置的数组 2.二维数组 var arr2=new Array(5,"hello"…
一.正则对象 1.创建方法 1)方式一 var re_obj=new RegExp("\d+","g") 规则+模式(g 全局模式/i 不区分大小写/gi) re_obj.test("asacdscsd124234")  //test方法只有两个返回值True.False 2)方式二 var re_obj2=/\d+/g; re_obj2.test("asacdscsd124234"); 二.Match对象…
一.Date对象 1.创建方法 var date_obj=new Date(); alert(date_obj.toLocaleString()) var date_obj=new Date("2017/4/16 13:27:11"); var date_obj=new Date("2017 4 16 13:27:11"); var date_obj=new Date("2017,4,16 13:27:11"); var date_obj=new…
JavaScript -- 构造函数 // 构造函数 function Player(name, age) { this.name = name; this.age = age; } JavaScript -- 静态方法 // 静态方法(只可用[构造函数]名字调用,不可用[实例对象]名字调用) Player.turnover = function () { console.log('我会失误'); } Player.turnover(); curry.turnover(); // 报错 curr…
一.语法 两种形式定义:文字形式和构造形式. //文字形式 var myObj = { key: value }; //构造形式 var myObj = new Object(); myObj.key = value; 二.类型 对象是JavaScript的基础. 1)基本类型 在JavaScript中一共有六种主要类型(术语是“语言类型”): string.number.boolean.null.undefined.object 2)内置对象 JavaScript中还有一些对象子类型,通常被称…
在Javascript中的对象和原型(二)中我们提到,用构造函数创建的对象里面,每个对象之间都是独立的,这样就会降低系统资源的利用率,解决这样问题,我们就要用到下面提到的原型对象. 一 原型对象 原型对象实际上就是构造函数的一个实例对象,和普通的实例对象没有本质上的区别. 可以包含特定类型的所有实例的共享属性或者方法.这样,如果我们需要修改所有实例中的属性或者方法,就只需要修改一处,就能够影响到所有实例了.因为原型 中的属性和方法是共享的.我们可以看下两个图示: 构造函数方式 原型模式方式 从上…
1 关于this 1.1 为什么使用this 随着你的使用模式越来越复杂,显式传递上下文对象会让代码变得越来越混乱,使用this则不会这样.当我们介绍对象和原型时,你就会明白函数可以自动引用合适的上下文对象有多重要. 1.2 关于误解 首先需要消除一些关于this的错误认识. 1.2.1 指向自身 先来看个例子: function foo(num) { console.log("foo: " + num); // 记录foo被调用的次数,这里this指向window this.coun…
一.对象 对象可以通过两种形式定义:声明(文字)形式和构造形式.即: var myObj = { key: value // ... }; 或: var myObj = new Object(); myObj.key = value; 对象还有一些内置对象: String.Number.Boolean.Object.Function.Array.Date.RegExp.Error. 访问对象属性可以使用. 操作符(属性访问)或者[] 操作符(键访问),区别在于:于. 操作符要求属性名满足标识符的…
最近家里杂事较多,自学时间实在少的可怜,所以都在空闲时间看看老外写的内容,学习之外顺便翻译分享~等学习的时间充足些再写写自己的一些学习内容和知识点分析(最近有在接触的:复习(C#,SQL).(学习)TypeScript,(基础操作)MongoDB.TypeScript之后入手AngularJs 2.0) 后续如有内容,本篇将会照常更新并排满15个知识点,以下是其他几篇译文的地址: 第一篇地址:( 译.持续更新 ) JavaScript 上分小技巧(一) 第二篇地址:( 译.持续更新 ) Java…
函数 函数是JavaScript中特殊的对象,对函数执行typeof运算会返回字符串"function",因为函数也是对象,他们可以拥有属性和方法. 静态方法 函数在JS中定义了类的名字,任何添加到函数的属性都是类字段和类方法(类比Java中类的static variable 和 static method),下面代码起到Java里面static method的效果: var foo = function(){}; foo.printLog = function(){ if (argu…
    体现对象原型分步式写法 //原型分步式写法 //构造函数 function Person(){} //对象原型 Person.prototype.name = 'Avensatr'; Person.prototype.age = '22'; Person.prototype.job = 'Software Engineer'; Person.prototype.sayName = function(){ console.log(this.name); } 我问你答?? 打印结果是?? v…
    体现对象原型分步式写法 //原型分步式写法 //构造函数 function Person(){} //对象原型 Person.prototype.name = 'Avensatr'; Person.prototype.age = '22'; Person.prototype.job = 'Software Engineer'; Person.prototype.sayName = function(){ console.log(this.name); } 我问你答?? 打印结果是?? v…
JavaScript中,我们希望别人无法修改我们创建的对象.比如,代码库的作者很可能想锁定核心库的某些部分来保证它们不被意外地修改.ES5中引入了三种锁定修改的级别:防止扩展preventExtensions.密封seal.冻结frezze. 这三种级别逐渐增强.对于超过级别的行为,在非严格模式下将会悄无声息地失败,在严格模式下将会抛出一个错误.因此,建议使用严格模式,更加方便调试. 正常对象: 可以添加属性和方法,所有属性和方法可以被删除.修改. var person = { name: "N…
一.MDN上的解释(有点抽象) 基于原型的语言? JavaScript 常被描述为一种基于原型的语言 (prototype-based language)——每个对象拥有一个原型对象,对象以其原型为模板.从原型继承方法和属性.原型对象也可能拥有原型,并从中继承方法和属性,一层一层.以此类推.这种关系常被称为原型链 (prototype chain),它解释了为何一个对象会拥有定义在其他对象中的属性和方法. 准确地说,这些属性和方法定义在Object的构造器函数(constructor funct…
1.构造函数和原型 1.1对象的三种创建方式 字面量方式 var obj = {}; new关键字 var obj = new Object(); 构造函数方式 function Person(name,age){ this.name = name; this.age = age; } var obj = new Person('zs',12); 1.2静态成员和实例成员 1.2.1实例成员 实例成员就是构造函数内部通过this添加的成员 如下列代码中uname age sing 就是实例成员,…
Javascript中的数据值有两大类:基本类型的数据值和引用类型的数据值. 基本类型的数据值有5种:null.undefined.number.boolean和string. 引用类型的数据值往大的说就1种,即Object类型.往细的说有:Object类型.Array类型.Date类型.Regexp类型.Function类型等. 当原型对象的属性值为基本类型的数据值时,通过实例对象修改属性值从而引起原型对象的属性值发生变化的情况不会发生.当原型对象的属性值为引用类型的数据值时,通过实例对象修改…
我们知道javascript里定义一个普通对象的方法,如: let obj = {}; obj.num = 1; obj.string = 'string'; obj.func = function(){alert('func')}; obj.arr = ['x','y']; console.log(obj.num); console.log(obj.string); // "string" console.log(obj.func); //function(){alert('func…
继承 mixin混合继承 function mixin(obj1, obj2) { for (var key in obj2) { //重复不复制 if (!(key in obj1)) { obj1[key] = obj2[key]; } } return obj1; } 这种复制是浅复制,对象或者数组函数等都是同一个引用,改变obj1的会同时影响obj2. 寄生继承 ... 隐式继承 子类调用fn.call(this) 深拷贝需要重新声明一个变量(对象),遍历(递归)复制,详情见我的函数技巧…
好想要对象··· 函数的调用位置不同会造成this绑定对象不同.但是对象到底是什么,为什么要绑定他们呢?(可以可以,我也不太懂) 语法 对象声明有两个形式: 1.字面量 => var obj = { ... }; 2.构造形式 => var obj = new Object(); 两种形式生成的对象是一样的,唯一的区别是,在文字声明中可以添加多个键值对,构造形式只能逐个添加. 类型 JS中有六种主要类型:string.number.booleam.null.undefined.object.…
在一般的编程语言中,我们使用继承来复用代码,做成良好的数据结构.而在JavaScript中,我们使用原型来实现以上的需求.由于JavaScript专注于对象而摒弃了类,我们要明白原型和继承的确是有差异的,但很多人接受不了这个事实,因此用某些语法来模仿类的操作.但如果我们要学习JavaScript,还是要抛开各种写法,先从原理上理解原型.JavaScript中原型并不是一个很难的事,但它是一个全新的概念,因此需要一些时间去接受. 1. 原型在哪儿 原型指明了一个对象的“身份”.在前面的介绍中我们知…
      这张图片有点劝退了,哈哈哈~    通过原型机制,JavaScript 中的对象从其他对象继承功能特性:这种继承机制与经典的面向对象编程语言的继承机制不同.本文将探讨这些差别,解释原型链如何工作,并了解如何通过 prototype 属性向已有的构造器添加方法 基于原型的语言? JavaScript 常被描述为一种基于原型的语言 (prototype-based language)——每个对象拥有一个原型对象,对象以其原型为模板.从原型继承方法和属性.原型对象也可能拥有原型,并从中继承…
1概述 ES6, 全称 ECMAScript 6.0 ,2015.06 发版.在ES6之前,对象不是基于类创建的,而是用一种称为构造函数的特殊函数来定义对象和它们的特征. 2构造函数 构造函数是一种特殊的函数,主要用来初始化对象,即为对象成员变量赋初始值,它总与 new 一起使用.我们可以把对象中一些公共的属性和方法抽取出来,然后封装到这个函数里面. // 利用构造函数创建对象 function Person(uname, age) { this.uname = uname; this.age…
 扩展javascript扩展(类,对象,原型)…
JS中对象相关的最重要的恐怕就是原型链了 原型链也是JS中对象继承的实现的基础 接昨天的文章,我们使用构造函数创建对象的时候仍然存在一些问题 那就是所有的实例没法共用一个函数 这样无疑会造成极大的内存浪费 那么解决的办法是什么呢? 那就是通过对象的原型来实现 原型链 在JS中我们创建的每一个函数都有一个 prototype(原型)属性 该属性是一个指针指向一个对象,这个对象的用途是包含由特定类型所有实例的共享属性和方法 这个对象也就是我们常说的原型对象 原型链就是对象实例和对象的原型对象组成的继…
一.JavaScript的概述###<1>JavaScript的概念 又称ECMAScript,和java没有任何关系 嵌入在HTML元素中的 被浏览器解释运行的 一种脚本语言. ###<2>特点 操作方便:任何文本编辑器都可以编写,有浏览器就可以执行 面向对象:内置了大量的对象 脚本语言:解释执行,事先不编译,逐行执行 ###<3>作用(使用HTML动态效果) 实现客户端数据格式的验证 处理浏览器的事件 制作特殊动态效果(轮播图,广告设计,特效等等) ###<4…
笔记摘自:<你不知道的JavaScript(上)>第3章 提升 1.包括变量和函数在内的所有声明都会在任何代码被执行前首先被处理. 2.变量和函数声明从它们在代码中出现的位置被“移动”到了最上面.这个过程就叫作提升. 3.只有声明本身会被提升,而赋值或其他运行逻辑会留在原地. 4.如果提升改变了代码执行的顺序,会造成非常严重的破坏. 5.思考以下代码: foo(); function foo() { console.log(a); // undefined var a = 2; } foo函数…