《JavaScript高级程序设计》手札之一:基础

一.工具:WebStorm.(关于破解,参考这里)
1.自动检测错误:option+enter
2.导航到:command+b
3.查找:shift+shift
4.查找引用:option+F7 
5.注释:command+/
6.格式化代码:Command+option+L
二.Some key points about this language:
1.欧洲计算机制造商协会(ECMA,European Computer Manufacturers Association)
2.js是一种专为与网页交互而设计的脚本语言,由下列三个不同的部分组成:
 ECMAScript,由 ECMA-262 定义,提供核心语言功能;
 文档对象模型(DOM),提供访问和操作网页内容的方法和接口;
 浏览器对象模型(BOM),提供与浏览器交互的方法和接口。
3.HTML 4.01 为 <script>定义了下列 6 个属性。
  •  async:可选。表示应该立即下载脚本,但不应妨碍页面中的其他操作,比如下载其他资源或 等待加载其他脚本。只对外部脚本文件有效。
  •  defer:可选。表示脚本可以延迟到文档完全被解析和显示之后再执行。只对外部脚本文件有 效。IE7 及更早版本对嵌入脚本也支持这个属性。
  •  src:可选。表示包含要执行代码的外部文件。
4.对于js很多的页面,一般放在最后,避免出现先显示一片空白的情况。
5.defer延迟加载但是有顺序,async异步加载没有顺序。
6. CDATA 指的是不应由 XML 解析器进行解析的文本数据(Unparsed Character Data)。
eg:
CDATA 部分由 "<![CDATA[" 开始,由 "]]>" 结束(解析器会忽略 CDATA 部分中的所有内容。即使里面有错误): 
<script>
 <![CDATA[ function matchwo(a,b) { if (a < b && a < 0) then { return 1; } else { return 0; } } ]]> 
</script>
View Code

 7.外部文件与嵌入代码比的优势:

①可维护性,放到同一个js文件夹中,可以在不触及html的情况下,集中精力编写js。
②可缓存。如果有2个页面都使用同一个文件,那么只需要加载一次。
③适应未来:无需hack代码。
8.js加上分号有时候也能增加性能,因为这个时候解析器就不必再花时间推测该在哪里加入分号了。
9.写var为局部变量,不写,为全局变量,
function test()
{
    message="11";
}
test();//必须执行,不然message不存在。
alert(message);
全局变量

10.ECMAScript简单数据类型:String,Undefined,Boolean,Number,Null
复杂数据类型:object
11.typeof是一个操作符而不是函数,所以后面有没有括号都可以。可以返回的值为:string,number,boolean,undefined,object,function六种。
var message="some string";
alert(typeof message);//“string”
alert(typeof (message));//“string"
typeof null;//object
null==undefined;//true;只是值相等,但是意义并不一样
test typeof

12.只要意在保存对象的变量还没有真正保存对象,就应该明确的让该变量保存null值。这样做不仅可以体现null作为空对象指针的惯例,而且也有助于区分null和undefined。
13.js区分大小写,Boolean的值是:true或者false,并非True,False,虽然字面值只有2个,但ECMAScript中所有类型的值都有与这两个Boolean值等价的值。转换方法:调用转型函数Boolean();//非空的等价于true,空的等价于false。
14.关于number。八进制中,第一位必须是0,第二位为0-7,如果超过将会被解析为10进制。16进制前两位必须为0x,后面可以跟0-9,A-F,字母可以大写也可以小写.
eg:var a=070;//八进制的,结果为56
var a=08;//十进制的8
var a=079;//十进制的79
var a=0xA;//16进制的10;
var a=0x1f://16进制,结果为10进制的31
15.保存浮点数值需要的内存空间是保存整数值的两倍。因此ECMAScript会不失时机的将浮点数值转换为整数值。浮点数值的最高精度是17位小数,但在进行算数计算时其精确度远远不如整数。例如:0.1+0.2的结果不是0.3而是0.300000000000000004,这个小小的舍入误差会导致无法测试特定的浮点数值。eg:if(a+b=0.3){alert(“is 0.3”)}//如果是0.1和0.2则为否,如果是0.05和0.25或者0.15和0.15就不会有问题,因为十进制转换2进制的时候,小数是*2从上写到下,直到结果为1.0,不是5的倍数的话会是无限小数。
16.isNaN(not a number):任何不能被转换为数值的值都会导致这个函数返回true,包括它本身。
eg:任何数除以0会返回NaN。
alert(isNaN(NaN))//true;
alert(isNaN(10))//false;
alert(isNaN(“10"))//false;可以被转换成数值10.
alert(isNaN(“blue”))//true;
alert(isNaN(true))//false,可以被转化成数值1
17.Number();如果字符串是空的(不包含任何字符),则转换为0;包含十六进制格式,例如”0xf”,将其转换成等值的十进制数值,如果字符串包含数字外的字符,则转换为NaN。
eg:var num=Number(“Hello world”);//NaN
18.parseInt("10",2)//2,后面表示以几进制来进行解析
19.parseFloat()与parseInt()的区别在于它始终会忽略前导的零。
eg:paraseInt(“070")//解析为56;
parseFloat(“070”)//解析为70;
十六进制格式的字符串始终会被转换成0.
eg:parseInt(“0xf”)//15;
parseFloat(“0xf”)//0
parseFloat("3.125e7”)//312500
parseInt("3.125e7”)//3
20.字符串是不可变的,即一旦创建长度为固定。
eg:var s="java";
s=s+”script”;//“javascript”,必须销毁原来的s,重新建一个s。
21.i++和++i不同,前置型和后置型的区别是,后置型是先运算总体后改变本身数值。
eg:
var num=2;
var num1=—-num+20;//输出num1=21,num=1;
var num2=num—-+20;//输出num2=22,num=1; 
22.字符串计算的时候,会被先调用valueOf()和toString()方法,在转换得到的值。一元加运算符,对计算结果不会有影响,相当于执行了类型转换,
eg:
var a=“0.1”;
var b=“z”;
var c={valueOf:function(){return -1;}};
a=+a;//0.1;
b=+b;//NaN;
c=+c;//-1;
23.二进制补码计算方法:
①求数值的绝对值,eg:-18的话,求18的二进制。
②求反码:0变1,1变0;
③+1;
24.如果对于非数值应用位操作符,会先使用Number()将该值转化为一个数值(自动完成),然后在应用位操作,得到的结果将是一个数值。
25.按位取非的本质:操作数的值负值-1.因为是在数值表示的最底层执行操作,所以比减法运算要快。
eg:var num=25;
var num1=~num;//num1=-26;
var num=-25;
var num2=~num;//num2=24
26.①左移不会影响操作数的符号位,eg:-2左移5位为十进制的-64而非64.
左移符号:<<
eg:var num=2;
var num1=num<<5;//num1=64;
②右移:
有符号:正数正常计算。负数用补码计算
(个人总结:一次移出32位后结果为原来的数,可以理解为,移除了整块内存空间,
eg:
var a=-3;
a=a>>32;//a=-3,如果移动2次为-2,3-31次以及它们*32的倍数均为-1;)
无符号的:正数同有符号完全一样。负数因为表示为其绝对值的补码,计算机会把转换成的补码当做正数的二进制码,所以结果会很大。
eg:var a=-2;//先转换成二进制补码,然后移位。
var b=a>>>5;//134217726
alert(b);
27.使用逻辑与操作时要始终铭记它是一个短路操作符。即第一个为false,后面的就为false。
eg:
var found=false;
var result=found&&UndefinedVariable;//结果为false;
28.规定:
var a=+0+(-0);//+0
var b=-0-(-0);//+0
var c=+0-(-0);//-0
var d=5-“”;//5,null和”"均被转化为0
29.不等和不全等的区别:不全等判断的时候必须是完全一样,而不等可以类型转换。
eg:var a=“55”!=55;//false;
var b=“55”!==55;//true;
30.break和continue不同,break退出整个循环,continue退出本次。
31.switch语句在比较值时使用的是全等操作符,因此不会发生类型转换(例如,字符串“10”不等于数值10).
32.arguments对象的长度是由传入的参数个数决定的,不是由定义函数时的命名参数的个数决定的。
33.函数的签名包括,参数和数量,因为ECMAScript函数没有签名,因为其参数是由包含零或多个值的数组来表示的。
34.ECMAScript变量可能包含2种不同数据类型的值:基本类型和引用类型值。基本类型指的是简单数据段,引用类型指那些可能由多个值构成的对象。将一个值赋给变量时,解析器必须确定这个值是基本类型还是引用类型.
基本类型:undefined,number,null,boolean,string。这五种基本数据类型是可以按值访问的,因为可以操作保存在变量中的实际的值。
引用类型的值是保存在内存中的对象。js不允许直接访问内存中的位置,也就是说不能直接操作对象的内存空间。在操作对象时,实际上是在操作对象的引用而不是实际的对象,为此,引用类型的值是按引用访问的。
eg1:引用类型可以增加,改变或者删除其属性和方法
var person=new Object();
person.name=“Nihao”;
alert(person.name);//“Nihao”,如果对象不被销毁或者这个属性不被删除,则这个属性一直存在。
eg2:值类型
var name=“leihao”;
name.age=27;
alert(name.age);//undefined.为字符串定义属性木有什么意义,下行访问就丢失了,因为字符串不是值类型,没属性。 
 
35.当在函数内部重写obj时,这个变量引用的就是一个局部对象了,而这个局部对象会在函数执行完毕后立即被销毁。
function setName(obj)
 
{
 
    obj.name="Nicholes";
 
    obj=new Object();
 
    obj.name="Greg";
 
}
 
var person=new Object();
 
setName(person);
alert(person.name);//"Nicholes"
View Code

36.检测基本类型,用typeof。eg:var s=“Nichole”;alert(typeof s);//string;

检测引用类型因为都会返回object,所以用instanceof操作符(检测原型链);
eg:
alert(person instanceof(Array));//false;因为是Object,注意大小写
 
37.关于环境变量,内部环境可以通过作用域访问外部环境,但外部环境不能访问内部环境中的任何变量和函数。
var color="blue";
 
function changecolor()
 
{
 
    var anothercolor = "yellow";
 
 
    function swapcolor () {
 
    var tempColor="red";
 
        anothercolor=tempColor;
 
        color=tempColor;
 
        //anothercolor,color,tempcolor are all accepted;
 
    }
 
    //only:color,anothercolor are accepted,tempcolor is not accepted;
 
    swapcolor();
 
}
 
//这里只能访问color;
changecolor();
View Code

38.js没有块级作用域(他们自己的执行环境),因而支持根据条件来定义变量。

eg:if(true){var color=“blue”;}alert(color);//“blue”;因为true是定义在window对象的。
eg:function add(num1, num2) {
         sum = num1 + num2;//如果不写var,则默认为全局变量。
        return sum;
}
var result = add(10, 20); //30
alert(sum);
39.查询标识符:return,查询到则终止,查不到这一直上溯往上查。
eg1:
var color = "blue";
  function getColor(){
      var color = "red";
      return color;
  }
  alert(getColor());  //"red"
eg2:
var color = "blue";
function getColor(){
    return color;
}
alert(getColor());  //"blue"
40.js的垃圾收集:找出不再使用的变量,然后释放其占用的内存。为此,垃圾回收会按照固定的时间间隔(或代码中预定的收集时间),周期性的执行这一操作。
41.垃圾清除:标记清除式(变量进去的时候标记,离开的时候再加标记,并完成内存清除工作),2008年为止,ie,chrome,opera,firefox,safari都是使用这个策略,只不过垃圾收集的时间间隔互有不同。
引用计数清除内存:存在循环引用的问题,ie中有可能采用技术策略。为避免此类问题发生,不使用的时候断开js对象和DOM元素之间的连接。ie9把BOM和DOM都转换成了真正的js对象,避免了2种垃圾收集算法并存导致的问题,也消除了常见的内存泄露现象。
eg:var element = document.getElementById("some_element");
    var myObject = new Object();
    myObject.element = element;
    element.someObject = myObject;
     //solution,下次垃圾回收运行的时候就会删除这些值并回收它们占用的内存。
    myObject.element = null;
    element.someObject = null;
42.一旦数据不有用,最好通过将其值设置为null来释放其引用——这个做法叫做解除引用。手动解除全局变量,因为局部变量会在它们离开执行环境时自动被解除引用。解除一个值的引用并不意味着自动回收该值所占的内存,解除引用的真正作用是让值脱离执行环境,以便垃圾收集器下次运行时将其运行。
eg:function createPerson(name){
    var localPerson = new Object();
    localPerson.name = name;
    return localPerson;
 }
var globalPerson = createPerson("Nicholas"); // 手工解除globalPerson引用
globalPerson = null; 

posted on 2016-04-01 15:50  鸣动我心  阅读(209)  评论(0编辑  收藏  举报