DeanPaul / blog

MIT License
2 stars 1 forks source link

SEC Session 1 #21

Closed DeanPaul closed 6 years ago

DeanPaul commented 6 years ago

《JavaScript 高级程序设计》 第一章 JavaScript 简介 第二章 在HTML 中使用JavaScript 第三章 基 本 概 念

DeanPaul commented 6 years ago

第一章 JavaScript 简介 1.2 JavaScript 实现

一个完整的JavaScript 实现应该由下列三个不同的部分组成。  核心(ECMAScript)  文档对象模型(DOM)  浏览器对象模型(BOM)

1.2.2 文档对象模型(DOM)

  1. 为什么要使用DOM 如果不对Netscape 和微软加以控制,Web 开发领域就会出现技术上两强割据,浏览器互不兼容的局面。此时,负责制定Web 通信标准的W3C(World Wide WebConsortium,万维网联盟)开始着手规划DOM。
  2. DOM 级别 DOM1 级(DOM Level 1)于1998 年10 月成为W3C 的推荐标准。DOM1 级由两个模块组成:DOM核心(DOM Core)和DOM HTML。其中,DOM 核心规定的是如何映射基于XML的文档结构,以便简化对文档中任意部分的访问和操作。DOM HTML 模块则在DOM 核心的基础上加以扩展,添加了针对HTML 的对象和方法。如果说DOM1 级的目标主要是映射文档的结构,那么DOM2 级的目标就要宽泛多了。DOM2 级在原来DOM 的基础上又扩充了(DHTML一直都支持的)鼠标和用户界面事件、范围、遍历(迭代DOM文档的方法)等细分模块,而且通过对象接口增加了对CSS(Cascading StyleSheets,层叠样式表)的支持。DOM1 级中的DOM核心模块也经过扩展开始支持XML 命名空间。DOM2 级引入了下列新模块,也给出了众多新类型和新接口的定义。 DOM视图(DOM Views):定义了跟踪不同文档(例如,应用CSS 之前和之后的文档)视图的接口;  DOM 事件(DOM Events):定义了事件和事件处理的接口;  DOM 样式(DOM Style):定义了基于CSS 为元素应用样式的接口;  DOM 遍历和范围(DOM Traversal and Range):定义了遍历和操作文档树的接口。 DOM3 级则进一步扩展了DOM,引入了以统一方式加载和保存文档的方法——在DOM 加载和保存(DOM Load and Save)模块中定义;新增了验证文档的方法——在DOM 验证(DOMValidation)模块中定义。DOM3 级也对DOM 核心进行了扩展,开始支持XML 1.0 规范,涉及XML Infoset、XPath和XML Base。

在阅读DOM标准的时候,读者可能会看到DOM0 级(DOM Level 0)的字眼。实际上,DOM0 级标准是不存在的;所谓DOM0 级只是DOM 历史坐标中的一个参照点而已。具体说来,DOM0级指的是Internet Explorer 4.0 和Netscape Navigator 4.0 最初支持的DHTML。

1.2.3 浏览器对象模型(BOM)

浏览器对象模型(BOM,Browser Object Model),HTML5 致力于把很多BOM 功能写入正式规范从根本上讲,BOM只处理浏览器窗口和框架;但人们习惯上也把所有针对浏览器的JavaScript 扩展算作BOM的一部分。下面就是一些这样的扩展:  弹出新浏览器窗口的功能;  移动、缩放和关闭浏览器窗口的功能;  提供浏览器详细信息的navigator 对象;  提供浏览器所加载页面的详细信息的location 对象;  提供用户显示器分辨率详细信息的screen 对象;  对cookies 的支持;  像XMLHttpRequest 和IE 的ActiveXObject 这样的自定义对象。

navigator :http://blog.csdn.net/j_bleach/article/details/61206039

1.4 小结 JavaScript 是一种专为与网页交互而设计的脚本语言,由下列三个不同的部分组成:  ECMAScript,由ECMA-262 定义,提供核心语言功能;  文档对象模型(DOM),提供访问和操作网页内容的方法和接口;  浏览器对象模型(BOM),提供与浏览器交互的方法和接口。

DeanPaul commented 6 years ago

第二章 在HTML 中使用JavaScript 2.3 文档模式 Doctype 混杂模式(quirks mode)①和标准模式(standards mode)

DeanPaul commented 6 years ago

第三章 基 本 概 念  语法  数据类型  流控制语句  函数

strict mode == ===

var obj1 = { valueOf:function(){return 20;}}
var obj2 = { valueOf:function(){return 'a';}}
var str1 = 'a';
var str2 = new String('a');
var obj3 = { valueOf:function(){return true;}}

Questions:
    1. If a==b b==c, 是否能证明 a==c?
    2. obj1 == 20 
    3. obj2 == str1 
    4. obj2 == str2 
    5. str1 == str2 
    6. obj3 == 1   

valueOf 在转换不同的数据类型时,相等和不相等操作符遵循下列基本规则:  如果有一个操作数是布尔值,则在比较相等性之前先将其转换为数值——false 转换为0,而true 转换为1;  如果一个操作数是字符串,另一个操作数是数值,在比较相等性之前先将字符串转换为数值;  如果一个操作数是对象,另一个操作数不是,则调用对象的valueOf()方法,用得到的基本类型 值按照前面的规则进行比较; 这两个操作符在进行比较时则要遵循下列规则。  null 和undefined 是相等的。  要比较相等性之前,不能将null 和undefined 转换成其他任何值。  如果有一个操作数是NaN,则相等操作符返回false,而不相等操作符返回true。重要提示:即使两个操作数都是NaN,相等操作符也返回false;因为按照规则,NaN 不等于NaN。  如果两个操作数都是对象,则比较它们是不是同一个对象。如果两个操作数都指向同一个对象,则相等操作符返回true;否则,返回false。

switch 语句在比较值时使用的是全等操作符,因此不会发生类型转换(例如,字符串"10"不等于数值10)。

函数

function func1(arg1){
    arguments[0].test = 2;
    console.log(arg1)
}
var param1 = {test:45}
func1(param1)
console.log(param1 )
-----------------------------------------------
function func2(arg1){
    arg1 = {};
}
var param1 = {test:45}
func2(param1)
console.log(param1 )
---------------------------------------------------
function func3(arg1){
    arguments = [];
    arguments [0]={};
    arguments [0].test = 555;
}
var param1 = {test:45}
func3(param1)
console.log(param1 )

Apply/Call 区别:func.call(func1,var1,var2,var3)对应的apply写法为:func.apply(func1,[var1,var2,var3])

定义一个log方法,让它可以代理console.log的方法,我们要给每个log方法添加一个”(app)”前缀,比如’hello world!’ ->'(app)hello world!’ 在Javascript中什么是伪数组?如何将伪数组转化为标准数组?

construct

var bus = function() {
    this.maxSpeed = 100;
    this.minSpeed = 10;
         this.show = function () {
        console.log('maxSpeed:' + this.maxSpeed + '   this.minSpeed:' + this.minSpeed);
    }
};
/*
bus.constructor = function (a, b) {
        this.maxSpeed = a;
        this.minSpeed = b;
}
*/
bus.prototype.constructor = function (a, b) {
        this.maxSpeed = a;
        this.minSpeed = b;
}

var t = new bus(1000,9);
t.show();
t.constructor(200,20);
t.show();

var man;
(function(){
  function Father (name) {
    this.name = name;
  }
  Father.prototype.sayName= function () {
    console.log(this.name);
  }
  man = new Father('aoyo');
})()
man.sayName();//aoyo
console.log(Father); //Father is not defined

man.constructor.prototype.sayAge = function(age){
    console.log(age);
}
man.sayAge('20'); //20

function Base() {}
// Sub1 inherited from Base through prototype chain
function Sub1(){}
Sub1.prototype = new Base();
Sub1.prototype.constructor = Sub1;
Sub1.superclass = Base.prototype;
// Sub2 inherited from Sub1 through prototype chain
function Sub2(){}
Sub2.prototype = new Sub1();
Sub2.prototype.constructor = Sub2;
Sub2.superclass = Sub1.prototype;

// Sub3 inherited from Sub1 through prototype chain
function Sub3(){}
Sub3.prototype = new Sub2();
Sub3.prototype.constructor = Sub3;
Sub3.superclass = Sub2.prototype;
// Test prototype chain
console.log(Sub2.prototype.constructor);// function Sub2(){}
console.log(Sub2.superclass.constructor);// function Sub1(){}
console.log(Sub2.superclass.constructor.superclass.constructor);// function Base(){}
console.log(Sub3.superclass.constructor.superclass.constructor.superclass.constructor);// function Base(){}


function F() {}  
F.prototype = {
    _name: 'Eric',
    getName: function() {
        return this._name;
    }
};
var f = new F();
alert(f.constructor === F); // output false
f.constructor===Object

function F() {}
F.prototype = {
    constructor: F, /* reset constructor */
    _name: 'Eric',
    getName: function() {
    return this._name;
    }
};

构造函数上怎么还有一个 constructor ?

console.log(typeof Array.constructor != 'undefined');// output true 
console.log(typeof Array.prototype.constructor === Array); // output true

console.log(Array.constructor === Function);// output true 
console.log(Function.constructor === Function); // output true

Dy-Aoi commented 6 years ago

泡泡会长,加油!

DeanPaul commented 6 years ago
var obj1 = { value:1};
var obj2 = obj1;
ojb2.t = 1;
obj1.value = 20;
console.log(obj1 == obj2);
console.log(obj1 === obj2);
DeanPaul commented 6 years ago
var b = {t:1}
function f1 (a){ 
    a.t = 'a';
    console.log(a==b);
    console.log(a===b)
}
f1(b)