重温Javascript(一)

  工作中要用到JavaScript,一组复习笔记。

一些看法



  1. 想想JavaScript目前最常用的宿主环境,浏览器或者服务端V8,都是单线程,所以不用过多的考虑并发的问题,如果是协程来实现异步的方法,反正就是不用考虑竟态条件了。

  2. 开发方式。又是OOP,又是OOF,对独立开发来说就是尽情发挥了。对协作开发来说,有时规范不是很好统一,可以实现的方式太过灵活,晕头转向是常有的事,要想通俗易懂,命名比写C# JAVA这类语言有更高的要求。反正经常看不明白this,鬼知道是被丢到哪个环境中被调用了。我想TypeScript也是无奈之下出来的解决方案了。

  3. 性能,每个终端有每个终端的环境也罗列不全,套的越深,越是坑。

  

  简单想想,最需要关注的还是JavaScript的OOP语法模型,毕竟不管是在浏览器或是服务器,其他的对象都封装好了,更多的考虑是实现功能的信息模型。

Object类型



  Object类型是所有对象实例的基类。

  hasOwnProperty(propertyName):用于检查给定的属性在当前对象实例中(不是原型)是否存在。参数propertyName必须是字符串。

  isPrototypeOf(object):object的原型链具有当前实例的原型链,则返回true。

全等操作符



  除了在比较值钱不转换操作数之外,全等和不全等操作符没什么区别。全等操作符由3个等号表示,只在两个操作数未经转换就相等的情况下返回。

函数arguments



  函数的agruments对象类似数组,可是使用索引来访问,arguments[0],也有length属性

值传递和引用传递



  其实这点有点像C#。

  1.基本类型值的复制    

var num1=5;
var num2=num1;

  

  2.引用复制

var obj1=new Object();
var obj2=obj1;
obj1.name="peter";
alert(obj2.name); //peter

  

  3.传递参数

  基本类型值的传递如同基本类型变量的复制,引用类型值得传递,如同引用类型变量的复制。

  

function addTem(num){
  num+=10;
  return num;
}

var count=20;
var result=addTen(count);
alert(count); //20 没有变化
alert(result); //30

  

function setName(obj){
  obj.name=“peter”;
}

var person=new Object();
setName(person);
alert(person.name); //peter

  

坑一 变量喜欢乱跳域


for(var i=0;i<10;i++){
  doSomething(i);
}

alert(i); //10

Function类型



  每个函数都是Function类型的实例,都与其他引用类型一样具有属性和方法。由于函数是对象,函数名实际上是一个指向函数对象的指针,不会与某个函数绑定。

function sum(num1,num2){
}

var sum=function(num1,num2){};

  

坑二 函数指针变化


function factorial(num){
    if (num <=1) {
        return 1;
    } else {
        return num * factorial(num-1)
    }
}

  根据上面函数指针的说法,factorial这个名字是可以指向另外的函数的,所以这个函数有可能在运行时被动态改变。

  出坑的方法

function factorial(num){
    if (num <=1) {
        return 1;
        } else {
            return num * arguments.callee(num-1)
        }
}

  arguments.callee是一个指针,指向拥有这个arguments对象的函数

var trueFactorial = factorial;
factorial = function(){
    return 0;
};
alert(trueFactorial(5)); //120
alert(factorial(5)); //0

  

this



  如果层级很绕,很难看清楚。

  总结就是,谁调用该函数,this就指向谁

window.color = "red";
var o = { color: "blue" };
function sayColor(){
    alert(this.color);
}
sayColor(); //"red"
o.sayColor = sayColor;
o.sayColor(); //"blue"

apply和call方法



  在特定的作用域中调用函数,设置函数体内this对象的值

  call与apply第一个参数都是作用域,后面的参数call必须一一列举,apply可以使用数组

function sum(num1, num2){
    return num1 + num2;
}
function callSum(num1, num2){
    return sum.call(this, num1, num2);
}
alert(callSum(10,10)); //20

bind方法



  会创建一个函数的实例,this值会被绑定到传给bind函数的值

window.color = "red";
var o = { color: "blue" };
function sayColor(){
    alert(this.color);
}
var objectSayColor = sayColor.bind(o);
objectSayColor(); //blue

  

encodeURI和encodeURIComponent的区别



  encodeURI不会对本身属于URI的特殊字符进行编码,例如冒号、正斜杠、问号和#;encodeURIComponent会对它发现的任何非标准字符进行编码

var uri = "http://www.wrox.com/illegal value.htm#start";

//"http://www.wrox.com/illegal%20value.htm#start"
alert(encodeURI(uri));

//"http%3A%2F%2Fwww.wrox.com%2Fillegal%20value.htm%23start"
alert(encodeURIComponent(uri));

  

eval方法



  当解析器发现代码中调用eval()方法时,会将传入的参数当做实际的ECMAScript语句来解析,把执行结果插入原位置。通过eval执行的代码被认为是包含该次调用的执行环境的一部分,因此被执行的代码具有与该执行环境相同的作用域链。通过eval执行的代码可以引用在包含环境中定义的变量

var msg = "hello world";
eval("alert(msg)"); //"hello world"

  

eval("function sayHi() { alert(‘hi‘); }");
sayHi();

  

eval("var msg = ‘hello world‘; ");
alert(msg); //"hello world"

  

时间: 2024-10-09 05:37:15

重温Javascript(一)的相关文章

【JavaScript】重温Javascript继承机制

上段时间,团队内部有过好几次给力的分享,这里对西风师傅分享的继承机制稍作整理一下,适当加了些口语化的描述,留作备案. 一.讲个故事吧 澄清在先,Java和Javascript是雷锋和雷峰塔的关系.Javascript原名Mocha,当时还叫做LiveScript,创造者是Brendan Eich,现任Mozilla公司首席技术官. 1994年,历史上第一个比较成熟的网络浏览器——Navigator0.9版诞生在网景公司(Netscape),极为轰动.但是,Navigator0.9只能用来浏览,不

重温 javascript (1) - javscript是什么

<重温javascript>这是一些列 javascript 的学习笔记,部分内容摘自书本或者网络,我这里只是基于自己的理解进行了梳理整理. 一个完整的 javscript 实现是由以下3部分组成的 : 核心 ECMAScript 文档对象模型 DOM 浏览器对象模型 BOM ECMAScript ECMAScript 并不与任何具体浏览器绑定,实际上,它没有提到用于任何用户输入输出的方法. ECMAScript 可以为不同种类的宿主环境提供核心的脚本编程能力,因此核心的脚本语言是与任何特定的

重温JavaScript

为什么说重温JS语言呢,是因为从最初入行时,已经学过JS脚本语言了,但是这一年来一直在研究数据库和后台开发,对于JS有些生疏,目前对数据库的操作以及c#语言有了一定的认知,所以重新学习JS语言的学习.本人学习有一个习惯,不喜欢管中窥豹式的方法, 而是喜欢系统性的学习,打算在博客里记录下来自己学习的里程,希望前辈指导,下面开始我的学习历程.注:基于W3School教程进行学习. 一.基础 JavaScript 实例 1.生成文本  <!DOCTYPE html> <html> <

重温Javascript(二)

对象 可以想象成散列表,键值对,值可以是数据或函数 创建对象的方式 1.工厂模式 1 function createPerson(name, age, job){ 2 var o = new Object(); 3 o.name = name; 4 o.age = age; 5 o.job = job; 6 o.sayName = function(){ 7 alert(this.name); 8 }; 9 return o; 10 } 11 var person1 = createPerson

重温Javascript(三)

继承 1.原型链继承 基本思想是利用原型让一个引用类型继承另一个引用类型的属性和方法.每个构造函数都有一个原型对象,原型对象都包含一个指向构造函数的指针,而实例都包含一个指向原型对象的内部指针.让原型对象等于另一个类型的实例,此时的原型对象将包含一个指向另一个原型的指针,相应的,另一个原型中也包含着一个指向另一个构造函数的指针.层层递进,构成了实例与原型的链条. function SuperType(){ this.property = true; } SuperType.prototype.g

重温Javascript继承机制

原文:http://mozilla.com.cn/post/21667/ =========================== 上段时间,团队内部有过好几次给力的分享,这里对西风师傅分享的继承机制稍作整理一下,适当加了些口语化的描述,留作备案. 一.讲个故事吧 澄清在先,Java和Javascript是雷锋和雷峰塔的关系.Javascript原名Mocha,当时还叫做LiveScript,创造者是Brendan Eich,现任Mozilla公司首席技术官. 1994年,历史上第一个比较成熟的网

重温Javascript(四)-函数

函数 函数声明提升,在执行代码之前会先读取函数声明 sayHi(); function sayHi(){ alert("Hi!"); } 递归 arguments.callee是指向正在执行的函数的指针 还可以换种方式达成一样的效果 var factorial = (function f(num){ if (num <= 1){ return 1; } else { return num * f(num-1); } }); 函数执行的作用域链 function compare(v

重温JavaScript基础(一)

JavaScript的类型 与Java\C语言一样,基本类型包含(数字,对象.函数.布尔.字符串),而在js中,由于null和undefined的特殊性,函数也是对象的这种特殊性,故而js的数据类型包含: Number.String.Boolean.Symbol(符号,第六版新增).Object[Function.Array.Date.RegExp.Math].Null.Undefined 关于javaScript的Number对象 js的数字不区分整数和浮点数,所有的数字均用浮点数表示,尤其是

基本类型和引用类型的值 [重温JavaScript基础(一)]

前言: JavaScript 的变量与其他语言的变量有很大区别.JavaScript 变量松散类型的本质,决定了它只是在特定时间用于保存特定值的一个名字而已.由于不存在定义某个变量必须要保存何种数据类型值的规则,变量的值及其数据类型可以在脚本的生命周期内改变.尽管从某种角度看,这可能是一个既有趣又强大,同时又容易出问题的特性,但 JavaScript 变量实际的复杂程度还远不止如此 基本类型和引用类型的值 复制变量值 传递参数 检测类型 基本类型和引用类型的值 ECMAScript 变量可能包含