读<了不起的Node.js>-02.JavaScript基本介绍

JavaScript

介绍

  • JavaScript是基于原型,面向对象,弱类型的动态脚本语言,它从函数式语言中借鉴了一些强大的特性,如闭包和高阶函数
  • js是根据ECMAScript语言标准来实现的
  • node使用了 v8 的原因,它的实现很接近标准,此外它还提供了一些标准之外使用的附加功能,

    • js基础,语言基础适用 node 浏览器 语言标准
    • v8 中得js 其特性是部分是浏览器不支持的 还提供了一些非特性的东西,能够解决一些常见的需求

类型

  • js的类型和可以简单的分为两种,基本类型和复杂类型
  • 基本类型包括,number,boolean,string,null 和 undefined
  • 复杂类型包括 array ,function 和object
  • 例子:
  • 书中用的还是var 但是var来声明变量会有一些不可知问题

  • 所以新版本里面全部用let 和const 来声明变量
  • let 代表的是可变变量
  • const 代表的是不可变变量
//基本类型
let a = 5;
let b = a;
b = 6;

console.log(a);
console.log(b);

console.log('``````````````````````````````````````');
//复杂类型
let x = ['hello', 'world'];
let y = x;
console.log(y[0]);
y[0] = 'bye';
console.log(x[0]);
console.log(y[0]);

  • 上述例子中得第二部分,b和a包含了对值的相同引用,因此,当通过b修改数组的第一个元素的时候,a相应的值也变了,说明a[0]=== b0

类型的困惑

  • 在js中准确无误判断变量值的类型并非易事
  • 相对于大部分基本类型来说 js于其他面向对象的语言一样都有构造器,
  • 例子
let a = 'woot';
let b = new String('woot');

console.log(typeof a);
console.log(typeof b);

//检查这个值的诗句类型是否属于 string
console.log(a instanceof String);
console.log(b instanceof String);
//判断变量值是否相等
console.log(a == b);
//判断地址值是否相等
console.log(a === b);

  • 以上例子可以表明 直接创建的和new出来的在内存中会实例化两个不同的地址出来,即使内容相同,地址值不同
  • 需要了解一些特定情况下的判断 false: null , undefined, ' ',还有0
let a = 0;
if (a) {
    //这里永远执行不到
}
a==false //true
a=== false // false
  • 还有值得注意的是 类型检测 typeof 不会把 null 识别为null 也不会吧[]识别为array

  • image.png
  • 但是这里v8给我们提供了判断是否是数组类型的方式

  • 在浏览器中我们通常要查看对象内部的[[Class]]值:Object.prototype.toString.call([]) == '[object Array]',该值是不可变得,有利我们在不同的上下文中对数组类型进行判定,而instanceof Array只适用于在与数组初始化在相同上下文才有效,也就是初始化在相同环境内才有效

函数

  • 在js中,函数最为==重要==
  • 例子 他们都属于一等函数:可以作为引用储存在变量中,随后可以像其他对象一样,进行传递
let a = function () { };
console.log(a);//将函数作为参数传递的
  • js中所有的函数都已命名,有一点很重要,就是要能区分出函数名和变量名
let a = function () { };

console.log(a);//将函数作为参数传递的


let b = function b() {
    if ('function' == typeof b) {//书中数这个结果是 true 但是我没有打印出任何结果
        console.log('true');
    }else{
        console.log('false');
    }
};

b(); //原来是我没有调用..
  • 下属代码函数被调用,this的值是全局对象,在浏览器中,就是window对象
function c(){
    if (window ==this){
        console.log("true");
    } else{
        console.log("false");
    }
}

c();//这样调用会报错 window is not defined
  • 调用下列函数的时候,使用.call和.apply方法可以改变this的值
function a (b,c){
    b == 'first';//true
    c == 'second';//ture
}

a.call({a:'b'},'first','second');
a.apply({a:'b'},['first','seccond']);
  • call 和 apply 的区别在于 ,call接收参数列表,而 apply 只接受一个参数数组

函数的参数数量

  • 函数的参数数量 也就是函数声明的时候可以接收的参数数量,和表示数组内有多少个值是一样的 用的是 length来表示

闭包

  • 在js 中,每次函数调用的时候,新的作用域就会产生.
  • 在某个作用域中得定一个的变量只能在该作用域或其内部作用域中才能访问到
//这里用var和用let 的结果会不一样,var 的作用域更大 且支持重复命名
//let是不支持重复命名的
var a = 5;
function woot() {
    a ===5 ;//true

    var a = 6;
    function test() {
        a === 6; //true
    }

    test();
};

woot();

  • 自执行函数是一种机制,通过这种机制声明和调用一个匿名函数,能够达到仅定义一个新的作用域的作用
let a = 3;

(function () {
    let a = 5;
})();

a ==3;//true
  • 自执行函数对声明私有变量是很有用的,可以让私有变量不被其他代码访问

  • js中是没有 class 关键字的,类只能通过函数来定义
function Animal ( )  {}
  • 要给所有Animal的实例定义函数,可以通过 prototype(属性使您有能力向对象添加属性和方法)
Animal.prototype.eat = function (food)  {
    //eat method
}
  • 这里在prototype的函数内部,this 并非指向 global 对象
  • 而是指向这个函数对象
function Animal (name) {
    this.name = name;
}

Animal.prototype.getName(){
    return this.name;//这里有问题 我用的idea
}

let animal = new Animal('tobi');
a.getName() == 'tobi'; //true

继承

  • js有基于原型的继承特点

  • 定一个一个来自Animal 的构造器

  • 定义继承,首先创造一个animal的对象,将其赋值给Ferret.prototype

  • 可以为子类定义属性和方法

  • 可以通过prototype重写和调用父类函数

  • 不会破会instanceof的结果

  • image.png
  • 这里我们主要看后面的 V8的解决办法

try{} catch{}

  • 异常捕捉

  • 当函数抛出错误时,代码就会停止

  • 我们这个通过这个方法,让代码继续进行下去

  • image.png
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,233评论 6 495
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,357评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 159,831评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,313评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,417评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,470评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,482评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,265评论 0 269
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,708评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,997评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,176评论 1 342
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,827评论 4 337
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,503评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,150评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,391评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,034评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,063评论 2 352

推荐阅读更多精彩内容

  • 第2章 基本语法 2.1 概述 基本句法和变量 语句 JavaScript程序的执行单位为行(line),也就是一...
    悟名先生阅读 4,145评论 0 13
  • JavaScript语言精粹 前言 约定:=> 表示参考相关文章或书籍; JS是JavaScript的缩写。 本书...
    微笑的AK47阅读 579评论 0 3
  • 第3章 基本概念 3.1 语法 3.2 关键字和保留字 3.3 变量 3.4 数据类型 5种简单数据类型:Unde...
    RickCole阅读 5,113评论 0 21
  • 人浮在世心中空 以往不再是以往 每一次的诗赋徒途 都拖着沉重心灵包袱 一字一句抒怀此刻 沉默、寂寞、伤痛 不再是牵...
    冯知阅读 244评论 9 15
  • 其实每时每刻都是新的开始 只是 每次都是因为什么事 或者 什么结束 伴随着什么的开始 基本都不会例外 包括这次 不...
    瑞恩出本书阅读 98评论 0 0