javascript 语法概括

  1. ""0NaNundefinednull 会在 if () 中自动转换成 false,其余都为 true

  2. StringInt 最快捷的方式 var str = '1'; +str ,运算中需要加括号 1 + (+str)

  3. 有字符串参与的加法运算,则全部转为 String 类型运行,其他运算法则(-,*,/,%)都全部转为 Number 类型运算。

  4. undefined 表示值类型的空值,null 表示指针类型的空值。

  5. 正则表达式、函数、对象、数组,都是引用类型,其余都是值类型。

  6. 所谓引用类型,即:var obj = {},相当于 0x01010101 <==> {}; obj = 0x01010101,而 var obj2 = obj 中传递的其实是 0x010101010x01010101 为假设的指针。

  7. 匿名函数的调用:

(function(){})();  // 正常
(function(){}());  // 正常
~function(){}();   // 正常
+function(){}();   // 正常
function(){}();    // 报错
// 前4个的结果是一样的
  1. new 与方法同一行调用:
function ClassA() { }
ClassA.prototype.say = function() { console.log('prototype'); }
ClassA.say = function() { console.log('constructor'); }
new ClassA().say();    // prototype   相当于  (new ClassA()).say()
new ClassA.say();      // constructor  相当于 new (ClassA.say())
  1. typeof 用于检测变量的类型:
typeof 'a'              => string
typeof 1/1.1/NaN        => number
typeof true             => boolean
typeof undefined        => undefined
typeof function (){}    => function
typeof {}、[]、null、/a/       => object
  1. instanceof 用于识别对象属于哪个类或其父类:
function Class1 () {}
function Class2 () {}
var class1 = new Class1;
class1 instanceof Class1;    => true
class1 instanceof Object;    => true
class1 instanceof Class2;    => false
  1. 变量的作用域提升:
alert(a);    // 报错,a未定义
alert(a);    // undefined
var a = 'a';    
// ---------- 相当于 ----------
var a;
alert(a);
a = 'a';
  1. 函数的作用域提升:
b();          // 调用成功
function b() {
      alert('b');
}
c();          // c = undefined,报错
var c = function () {
      alert('c');
}
  1. 类的定义
function Class1(name) {
      this.name = name;
}
Class1.prototype.setAge = function(age) {
      this.age = age;
}
var class1 = new Class1('class1');
class1.setAge(10);
  1. 类的继承
function Class2(time) {
      Class1.call(this, 'orange');
      this.time = time;
}
Class2.prototype = Object(Class1.prototype);
Class2.prototype.constructor = Class2;
var class2 = new Class2(10);
class2.setAge(20);
  1. this 的指向
function Animal() {
       console.log(this); 
}
var animal = new Animal();  // this 指向 Animal 
function Animal() {
      console.log(this);
}
function Dog() {
      console.log(this);
      Animal.call(this);
}
var dog = new Dog();   // 由于 Animal 的调用传入 Dog 的 this,两个的 this 都指向 Dog
var obj = {
      fn: function() {
          console.log(this);
      }
}
obj.fn();
// -------------- 相当于 ---------------
var obj = new Object;
obj.fn = function() {
      console.log(this);
}
obj.fn();   // this 为 obj 对象的 Object 类
var obj = {
      fns: {
            fn: function() {
                  console.log(this);
            }
       }
}
obj.fns.fn();  // this 指向 fns 对象的 Object 类
// ---------------- 相当于 ----------------
var obj = new Object;
var fns = new Object;
fns.fn = function() {
      console.log(this);
}
obj.fns = fns;
obj.fns.fn();
function fn(){
      console.log('outer: ' + this);
      return function () {
            console.log('inner: ' + this);
      }
}
var closure = fn.call({});   // outer: Object
closure();                   // inner: window
// this 的值是根据调用时的上下文,而不是定义时的上下文。
function fn() {
     console.log(this);
}
fn();     // 无实例化过程,默认 this 为全局对象 Global,浏览器中为 window
  1. prototype 原型链
    · 类有 prototype ,对象没有 prototype:
function Class1() { }
var instance1 = new Class1;
console.log(Class1.prototype);     // Object {constructor: function}
console.log(instance1.prototype);  // undefined

· 对象通过 __proto__ 属性访问类的 prototype

function Class1() { }
var instance1 = new Class1;
console.log(Class1.prototype);       // Object {constructor: function}
console.log(instance1.__proto__);    // Object {constructor: function}
console.log(Class1.prototype === instance1.__proto__);   // true

· prototype 方法与构造函数中的方法的区别:

function Class1() {
      this.setName = function (name) {
      }
}
Class1.prototype.setAge = function () {
}
var instance1 = new Class1;
var instance2 = new Class1;
console.log(instance1.setName === instance2.setName);  // false
console.log(instance1.setAge === instance2.setAge);    // true
// 构造函数中的方法每次实例化都会重新复制一个函数实体,
// 会造成实例化过程中多余的内存消耗,在面向对象编程概念中是错误。

· prototype 属性与构造函数中的属性的区别:

function Class1() {
      this.name = "";
}
Class1.prototype.age = 0;
var instance1 = new Class1;
var instance2 = new Class1;
instance1.name = 'instance1';
instance2.age = 10;
console.log(instance1.age);    // 0
console.log(instance2.age);    // 10
console.log(instance1);        // Class1 {name: "instance1"}
console.log(instance2);        // Class1 {name: "", age: 10}
console.log(instance1.__proto__);  // Object {age: 0, constructor: function}
console.log(instance2.__proto__);  // Object {age: 0, constructor: function}
// 可以发现,访问属性时,优先访问构造函数中同名属性,如果没有,
// 再访问 __proto__ 中的,而赋值属性时,是无法给 prototype 中的属性赋值的。

· 类继承中的 prototype

function God() { }
God.prototype.fly = function() { }
function Parent() { }
Parent.prototype = new God;
Parent.prototype.run = function() { }
function Children() { }
Children.prototype = new Parent;
Children.prototype.walk = function() { }
var boy = new Children;
console.log(boy.__proto__);                      // {walk: function}
console.log(boy.__proto__.__proto__);            // {run: function}
console.log(boy.__proto__.__proto__.__proto__);  // {fly: function, constructor: function}
console.log(boy.fly);                            // function () { }
// 在对象访问属性或方法时,会不断向对象中的 __proto__ 查找,
// 如果上一级找不到,会继续查找 __proto__.__proto__ ,最终找不到则会返回 undefined。
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 201,681评论 5 474
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 84,710评论 2 377
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 148,623评论 0 334
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,202评论 1 272
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,232评论 5 363
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,368评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,795评论 3 393
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,461评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,647评论 1 295
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,476评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,525评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,226评论 3 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,785评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,857评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,090评论 1 258
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,647评论 2 348
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,215评论 2 341

推荐阅读更多精彩内容