!=、== 、!==、===的用法和区别javascript
var num = 1; var str = '1'; var test = 1; test == num //true 相同类型 相同值 test === num //true 相同类型 相同值 test !== num //false test与num类型相同,其值也相同, 非运算确定是false num == str //true 把str转换为数字,检查其是否相等。 num != str //false == 的 非运算 num === str //false 类型不一样,直接返回false num !== str //true num 与 str类型不一样 意味着其二者不等 非运算天然是true啦
一. 普通对象与函数对象html
JavaScript 中,万物皆对象!但对象也是有区别的。分为普通对象和函数对象,Object 、Function 是 JS 自带的函数对象。下面举例说明java
var o1 = {}; var o2 =new Object(); var o3 = new f1(); function f1(){}; var f2 = function(){}; var f3 = new Function('str','console.log(str)'); console.log(typeof Object); //function console.log(typeof Function); //function console.log(typeof f1); //function console.log(typeof f2); //function console.log(typeof f3); //function console.log(typeof o1); //object console.log(typeof o2); //object console.log(typeof o3); //object
每一个对象都有 __proto__ 属性(),通常只有函数对象才有 prototype 属性
先上简单的图助于理解python
原型链终极版图程序员
所谓原型链,指的就是图中的proto这一条指针链!chrome
原型链的顶层就是Object.prototype,而这个对象的是没有原型对象的。浏览器
可在chrome的控制台里面输入:app
Object.__proto__
输出是:dom
function Empty() {}
原型链,如此而已。函数
<script type="text/javascript"> function Person(name, age){ this.age=age this.name=name } Person.prototype.setName = function (name) { this.name = name } function Student(name, age, price){ Person.call(this, name,age) this.price=price } Student.prototype = new Person() // 把父类绑定到子类中去 Student.prototype.constructor = Student // 修正子类constructor属性 Student.prototype.setPrice = function (price) { this.price = price } var s = new Student("tom", 14, 64648) s.setName("alex") s.setPrice(1600) console.log(s.name, s.age, s.price) </script>
参考http://www.javashuo.com/article/p-cenbrctd-bu.html
JavaScript中在调用函数的那一瞬间,会先进行词法分析。
词法分析的过程:
当函数调用的前一瞬间(能够理解为是编译时间,不执行),会先造成一个激活对象:Avtive Object(AO),并会分析如下3个方面:
1:函数参数,若是有,则将此参数赋值给AO,且值为undefined。若是没有,则不作任何操做。
2:函数局部变量,若是AO上有同名的值,则不作任何操做。若是没有,则将此变量赋值给AO,而且值为undefined。
3:函数声明,若是AO上有,则会将AO上的对象覆盖。若是没有,则不作任何操做。
函数内部不管是使用参数仍是使用局部变量都到AO上找。
看两个例子:
var age = 18; function foo(){ console.log(age); var age = 22; console.log(age); } foo(); // 问:执行foo()以后的结果是?
第二题:
var age = 18; function foo(){ console.log(age); var age = 22; # 到这编译时生成AO.age=undefine; console.log(age); function age(){ # AO.age=function()这里变成方法 console.log("呵呵"); } console.log(age); } foo(); // 执行后的结果是? # 没有参数
词法分析过程:
一、分析参数,有一个参数,造成一个 AO.age=undefine; 2、分析变量声明,有一个 var age, 发现 AO 上面已经有一个 AO.age,所以不作任何处理 三、分析函数声明,有一个 function age(){...} 声明, 则把原有的 age 覆盖成 AO.age=function(){...}; 最终,AO上的属性只有一个age,而且值为一个函数声明 执行过程: 注意:执行过程当中全部的值都是从AO对象上去寻找 1、执行第一个 console.log(age) 时,此时的 AO.age 是一个函数,因此第一个输出的一个函数 二、这句 var age=22; 是对 AO.age 的属性赋值, 此时AO.age=22 ,因此在第二个输出的是 2 三、同理第三个输出的仍是22, 由于中间再没有改变age值的语句了
自定义对象注意点
JavaScript的对象(Object)本质上是键值对的集合(Hash结构),可是只能用字符串做为键,浏览器会默认吧键的字符串的引号去掉。
var a = {"name": "Alex", "age": 18}; console.log(a.name); console.log(a["age"]);
遍历对象中的内容:
var a = {"name": "Alex", "age": 18}; for (var i in a){ console.log(i, a[i]); }
对象.访问和对象[ ]访问的区别
jQuery语句必须放在$(function(){});里面吗?
不是必须的。
1
2
3
|
js在浏览器渲染页面时是按照在文档中出现的顺序来顺序执行的。所以若是js文件在<header>部分引入,那么文件中的js代码会在dom元素渲染完毕前就执行。假设js代码中有相似$('#elementId').click(function(){...});这样的语句,那么就会由于dom没有渲染完,致使根本找不到elementId这个对象,从而致使事件绑定失败。
可是,若是咱们把js的内容放到$(function(){...});里面,这里面的代码会等到文档内容所有渲染完毕才执行。事件就可以成功绑定了。
因此咱们通常在写代码时,一般会注意两点
一、借用$(function(){});包括js内容
二、将须要引入的js文件放在dom的底部引入
1
2
3
4
5
6
7
8
9
10
|
<
html
>
<
head
>
....
</
head
>
<
body
>
<
div
>...</
div
>
<
div
>...</
div
>
<
script
src
=
"/script/test.js"
>
</
body
>
</
html
>
|