<!DOCTYPE html>
<html>
<head>
<title>Example Html Page</title>
</head>
<body>
<script type="text/javascript" src="Example.js"></script>
</body>
</html>>
在Html中插入JavaScript的方法,将Script放在body中相比于放在head中可以提高加载速度,因为页面执行到body才开始加载
defer可以使语句延迟执行
<script type="text/javascript" defer="defer" src="Example.js"></script>
与Swift中的defer不同,当存在多个defer时,前一个defer先于后一个defer执行
typeof会以字符串的方式返回所给参数的类型
声明但没有初始化的变量默认值是undefined,但没声明过的不是
但typeof以未声明变量作参数时也会返回undefined
null表示一个空对象指针,undefined派生于null
“” 与 ‘’在使用中相同,都表示字符串,但需要匹配
1e2 = 100, 1e+2 = 100, 1e-2 = 0.01
var message ="Hello world"
if (message) {
alert("value is true")
}
经此if判断过后,message的值变为true,变量类型也右String转换成了Bool
当定义Number时,若先导为0x则以十六进制数解析,先导为0时以八进制数解析,但若字面值的数值超过了范围,先导0就会被忽略,按十进制处理
浮点数中必须含有一个小数点,小数点后至少有一位数字,若没有数字或.0就会被转换为整数
浮点数在进行算数计算的时候精度远远不足
NaN is NaN,10 is not NaN, true is not NaN, “10” is not NaN, “blue” is NaN
parseInt的最佳实践
var number = parseInt(“29”,10)
parseFloat忽略第二个小数点及以后的值
var o = new object()
在对非数值类型使用一元操作符+时,会将其转换为number,-会将其转化为number之后取负
== 代表转换后equal === 代表identical
with的作用是将代码的作用域设置到同一个对象上
var qs = location.search.substring(1);
var hostname = location.hostname;
var url = location.href;
with(location) {
var qs = search.substring(1);
var hostname = hostname;
var url = href;
}
在该语言中Switch一般case后面都有break; default后没有
function sum(num1, num2) {
return num1 + num2;
}
函数体并不介意你传递进来的参数有多少、是什么类型,参数被统一装到一个数组里传递给函数,用arguments[]来获取不同参数。
在函数体内调用,arguments.length可获得参数的个数
function sum(num1, num2) {
if (arguments.length = 1) {
return num1 + 10;
} else if (arguments.length = 2) {
return num1 + num2;
}
}
即便定义时定义了两个参数,也可以只传一个进去,ECMAScript中所有的参数都是值类型,但arguments[]内的各个值和传进来的参数始终保持同步,定义但没被传入的会被赋予undefined
JS中没有重载,后定义的会覆盖先前定义的
JS中分为基本类型和引用类型
对于引用类型
var person = new Object();
person.name = “A";
alert(person.name);
你可以为其添加属性和方法,只要该对象不删除,属性和方法会一直存在
基本类型不可以这么做,虽然不会报错
基本类型是复制,引用类型是指针传递
function setName(obj) {
obj.name = "A";
obj = new Object();
obj.name = "B";
}
var person = new Object();
setName(person);
person.name这时候是A
举个例子,就像是配了把钥匙,仍然能开原来的锁,但是你把这个钥匙锻成能开别的锁,原来那把钥匙仍然没有变
检测基本类型的变量类型用typeof
var s = “A"
typeof s //String
检测引用类型的变量类型用instanceof
result = variable instanceof constructor
result是bool
基本类型用instanceof的时候总返回false,因为基本类型不是对象
JS中没有块级作用域,for、with等中定义的变量外面也能用
函数有自己的环境,初始化变量时使用了var,就会被添加到最近的环境中,如果没用,就会被自动添加到全局环境中
当需要引用到一个标识符的时候,会从最近的环境开始沿着作用域链向上找,找到就停止,直到找到全局环境,没有则返回undefined
而且好像相互包含的环境中变量名也可以相同
var element = document.getElementById(“some_element”);
var myObject = new Object();
myObject.element = element;
element.someobject = myObject;
这样就存在了循环引用,永远留在内存之中
通过
myObject.element = Null;
element.someObject = Null;
来消除循环引用
在
Swift
中用的是
unowned
和
weak
通过将一个值赋予
null
来手工解除引用以便垃圾收集器下次将其回收
function displayInfo (args) {
var output = “”;
if (typeof args.name == “string”) {
output += args.name;
}
if (typeof args.age == “number”) {
output += args.age;
}
alert(output);
}
传进去的args可以有name或age也可以都没有
displayInfo({
name: "A",
age: 29
});
通过方括号表示法可以用变量来访问属性
var colors = new Array();
var colors = new Array(20); //如果事先知道
var colors = new Array(“A”,”B");
若里面放了数字,创建给定项数的数组,如果是别的,创建给定内容的,只有一项的数组
创建数组时,new可以被省略,也可以直接用方括号(妈个鸡不早说)
var colors = []; //空数组
var colors = new Array(“A”,”B");
colors[2] = “C"
不像C一样,JS超过范围,数组会自动增加到该索引值加1的长度
.length用来返回数组的长度
而且length这个属性不是只读的,length缩小,后面的值变为undefined,length增大,多出的每一项都是undefined
用colors[colors.length]就可以在数组的后面添加新元素
通过Array.isArray(value)可判断value是不是数组
colors.toString() 会返回每个值的字符串形式拼接而成的一个以逗号分隔的字符串,而调用valueOf返回的还是数组
var person1 = {
toLocalString: function () {
return "A"
}
toString: function() {
return "B"
}
}
console.log(Object.prototype.toString.call([])); //可以用来判断是数组还是对象
用instanceOf存在跨页面问题
alert(colors.join(“,"))
数组存在栈方法push(),和pop()
pop()不给参数返回值是最后一项,push()给参数被添加在数组最后
队列方法shift()取得第一项,数组长度减一,用push()从后面推入
数组的unshift()方法从数组前面推入任意数目的项,用pop()取最后一项
reverse()函数用来倒序
sort()默认是用toString()比,一般结果都比较不靠谱,应传入比较函数,第一个在前就返回负数
concat方法用于添加数组元素
var colors = ["red", "green", "blue"];
var colors2 = colors.concat("yellow", ["black", "brown"]);
alert(colors2); //red,green,blue,yellow,black,brown
slice方法用于截取,不包括结束位置,不改变原数组
var colors = ["red", "green", "blue", "yellow", "purple"];
var colors2 = colors.slice(1); //green,blue,yellow,purple
var colors3 = colors.slice(1,4) //green,blue,yellow
数组拥有splice方法
splice(0,2),删除数组中的前两项
splice(2,0,”red”,”green”),从位置2开始,删除0个字符,再插入red和green
数组的indexOf()方法和lastIndexOf()方法,用于查找特定项的位置,一个是从前向后,另一个反过来,没有找到返回-1
var numbers = [1,2,3,4,5,4,3,2,1];
alert(numbers.indexOf(4,4)); //5
alert(numbers.lastIndexOf(4,4)); //3
数组有五个迭代方法
every():对数组中的每一项运行给定函数,每一项为真则为真
filter():每一项都运行,返回会返回真的项所组成的数组
forEach():对数组的每一项运行给定函数,没返回值
map():每一项都运行给定函数,返回每次结果组成的数组
some():若有任意一项返回为true,则返回true
每个方法接收两个参数,第一个是要运行的函数,第二个是运行该函数的作用域对象(可选)
运行的函数会接收三个参数,数组每一项的值,该项在数组中的位置和数组本身
var numbers = [1,2,3,4,5,4,3,2,1];
var filterResult = numbers.filter(function(item,index,array){
return (item > 2);
})
var mapResult = numbers.map(function(item,index,array){
return item * 2;
})
数组有缩小方法reduce()和reduceRight(),会迭代所有项,返回一个值,一个从前向后,一个反过来
每个方法接收两个参数,一个在每一项上调用的函数,一个作为缩小基础的初始值(可选)
调用的函数会接收四个参数,前一项,当前项,索引,和数组本身
var values = [1,2,3,4,5];
var sum = values.reduce(function(prev,cur,index,array){
return prev+cur;
})
reduceRight()从后往前一个意思