JavaScript学习笔记-Inherits
原型继承c++,python,java继承的本质是扩展一个已有的Class,并生成新的Subclass。JavaScript由于采用原型继承,我们无法直接扩展一个Class,因为根本不存在Class这种类型。
JavaScript 的原型继承实现方式:
定义新的构造函数,并在内部用 call() 调用希望“继承”的构造函数,并绑定 this ;
借助中间函数 F 实现原型链继承,最好通过封装的 inherits 函数完成;
继续在新的构造函数的原型上定义新方法。
inherits 方法构造function inherits(Child,Parent){ var F=function(){}; F.prototype=Parent.prototype; Child.prototype=new F(); Child.prototype.constructor=Child; }//实例function Student(props){ this.name=props.name || 'unnamed'; ...
JavaScript学习笔记-Regular Expression
JS 正则
\d 可以匹配一个数字
\w 可以匹配一个字母或数字
\s 可以匹配一个空格
. 可以匹配任意字符
* 表示任意个字符(包括 0 个)
+ 表示至少一个字符
? 表示 0 个或 1 个字符
{n} 表示 n 个字符
{n,m} 表示 n-m 个字符
[] 表示范围
[0-9a-zA-Z\_] 可以匹配一个数字、字母或者下划线
[0-9a-zA-Z\_]+ 可以匹配至少由一个数字、字母或者下划线组成的字符串,比如’a100’,’0_Z’,’js2015’等等;
[a-zA-Z\_\$][0-9a-zA-Z\_\$]* 可以匹配由字母或下划线、$开头,后接任意个由一个数字、字母或者下划线、$组成的字符串,也就是JavaScript允许的变量名;
[a-zA-Z\_\$][0-9a-zA-Z\_\$]{0, 19} 更精确地限制了变量的长度是1-20个字符(前面1个字符+后面最多19个字符)。
A|B可以匹配A或B,所以(J|j) ...
JavaScript学习笔记-prototype
原型 prototypevar Student={ name:'robort', height:1.2, run:function(){ return console.log(this.name+" is running..."); } } var xm=Object.create(Student); xm.name='xiaoming' xm.name//"xiaoming" xm.run()//"xiaoming is running..." xm.height//1.2 xm.__proto__===Student; //true
构造prototype除了直接用{ … }创建一个对象外,JavaScript还可以用一种构造函数的方法来创建对象。它的用法是,先定义一个构造函数:
function Student(name,age){ this.name=name; this.age=age; this.hello=funct ...
JavaScript学习笔记-JSON
jsonJSON是JavaScript Object Notation的缩写,它是一种数据交换格式。2002年,雅虎的高级架构师道格拉斯·克罗克福特(Douglas Crockford)发明了JSON这种超轻量级的数据交换格式。
数据类型
number:和JavaScript的 number完全一致;
boolean:就是JavaScript的 true或 false;
string:就是JavaScript的 string;
null:就是JavaScript的 null;
array:就是JavaScript的Array表示方式——[];
object:就是JavaScript的 { ... }表示方式。
and …
字符集必须是 UTF-8;
JSON 的字符串规定必须用双引号 "",Object 的键也必须用双引号 ""。
序列化使用JSON.stringify()方法。把任何JavaScript对象变成JSON,就是把这个对象序列化成一个JSON格式的字符串,这样才能够通过网络传递给其他计算机。
var ...
JavaScript学习笔记-变量作用域与解构赋值
变量作用域
如果一个变量在函数体内部申明,则该变量的作用域为整个函数体,在函数体外不可引用该变量;
如果两个不同的函数各自申明了同一个变量,那么该变量只在各自的函数体内起作用。换句话说,不同函数内部的同名变量互相独立,互不影响;
JavaScript的函数可以嵌套,此时,内部函数可以访问外部函数定义的变量,反过来则不行;
JavaScript的函数在查找变量时从自身函数定义开始,从“内”向“外”查找。如果内部函数定义了与外部函数重名的变量,则内部函数的变量将“屏蔽”外部函数的变量。
变量提升JavaScript的函数定义有个特点,它会先扫描整个函数体的语句,把所有申明的变量“提升”到函数顶部
'use strict';function foo() { var x = 'Hello, ' + y; alert(x); var y = 'Bob';}foo();
虽然是strict模式,但语句var x = ‘Hello, ‘ + y;并不报错,原因是变量y在稍后申明了。但 ...
JavaScript学习笔记-Function
定义函数方法1function abs(x) { if (x >= 0) { return x; } else { return -x; }}
function指出这是一个函数定义;
abs是函数的名称;
(x)括号内列出函数的参数,多个参数以,分隔;
{ ... }之间的代码是函数体,可以包含若干语句,甚至可以没有任何语句。
函数体内部的语句在执行时,一旦执行到return时,函数就执行完毕,并将结果返回。因此,函数内部通过条件判断和循环可以实现非常复杂的逻辑。
如果没有return语句,函数执行完毕后也会返回结果,只是结果为undefined。
方法2var abs = function (x) { if (x >= 0) { return x; } else { return -x; }};
和第一种形式等价,末尾要加 ;。在 ...
JavaScript学习笔记-Map&Reduce
高阶函数一个函数就可以接收另一个函数作为参数,这种函数就称之为高阶函数。
function add(x, y, f) { return f(x) + f(y);}var x = add(-5, 6, Math.abs); // 11alert(x);//等价于var x = Math.abs(-5)+ Math.abs(6)
map由于map()方法定义在JavaScript的Array中,我们调用Array的map()方法,传入我们自己的函数,就得到了一个新的Array作为结果:
var arr=[1,2,3,4,5,6];function f(x){ return x*x};var xx=arr.map(f); //[1, 4, 9, 16, 25, 36]//等价于var f = function (x) { return x * x;};var arr = [1, 2, 3, 4, 5, 6, 7, 8, 9];var result = [];for (var i=0; i<a ...
JavaScript学习笔记-对象的方法
定义给xiaoming绑定一个age()方法:
>var xiaoming={ name:'xiaoming', birth:1990, age: function(){ var y= new Date().getFullYear() // return y-this.birth } }>xiaoming.age//function(){// var y= new Date().getFullYear()// return y-this.birth// }>xiaoming.age() //28
方法内部,this是一个特殊变量,它始终指向当前对象,也就是xiaoming这个变量。所以,this.birth可以拿到xiaoming的birth属性。类似于python class 方法中的 self 参数
看一些例子:
function getAge() { va ...
JavaScript学习笔记-For& While
forfor循环,通过初始条件、结束条件和递增条件来循环执行语句块
var x = 0;var i;for (i=1; i<=10000; i++) { x = x + i;}x; // 50005000
遍历数组:
var arr = ['Apple', 'Google', 'Microsoft'];var i, x;for (i=0; i<arr.length; i++) { x = arr[i]; alert(x);}
for … invar arr = ['Apple', 'Google', 'Microsoft'];var i, x;for (i in arr) { x = arr[i]; //i遍历的是索引 alert(x);}
or
var o = { name: 'Jack', age: 20, cit ...
JavaScript学习笔记-Array
基本操作>var arr=[1,2,3,'hjh']1,2,3,"hjh">arr.length4>arr.indexOf(3)2>arr.indexOf('no') //不存在返回-1-1
可以通过索引把对应的元素修改为新的值,因此,对Array的索引进行赋值会直接修改这个Array:
var arr = ['A', 'B', 'C'];arr[1] = 99;arr; // arr现在变为['A', 99, 'C']arr[5] = 'x';arr; // arr变为['A', 99, 'C', undefined, undefined, 'x']
大多数其他编程语言不允许直接改变数组的大小,越界访问索引会报错。然而,JavaScript的Array却不会有任何错误。在编写代码时,不建议直接修改Array的大小,访问 ...
JavaScript学习笔记-If-else
if clauseif () { ... } else { ... }
e.g. judge the teenager
var age = 20;if (age >= 18) { alert('adult');} else { alert('teenager');}//or 单行情况下var age = 20;if (age >= 18) alert('adult'); else alert('teenager');
多重判断if () { ... } else if (){ ...}else { ... }
e.g.
var age = 3;if (age >= 18) { alert('adult');} else if (age >= 10) { ...