话题一:undefined,null,"",0这四个值转换为逻辑值时就是false

也就是在if判断时会把上面的五个作为false来判断。但是它们的类型确是不尽相同的,如下所示。

 typeof(undefined) == 'undefined'
typeof(null) == 'object'
typeof("") == 'string'
typeof(0) == 'number'
typeof(false) == 'boolean'

下面是案例来说明,逻辑值为false的情况。

<script type="text/javascript">
function myFunc(){
if(!undefined){
alert("test1");
}
if(!null){
alert("test2");
}
if(!""){
alert("test3");
}
if(!0){
alert("test4");
}
if(!false){
alert("test5");
}
}
myFunc();
</script>

这些都会通过判断,因为它们都表示false。

另外再补充一下

"123" == 123 返回true
"123" === 123 返回false

三个等于号表示完全等,类型也要相等,前面的一二三表示字符串,后面的是数字。

话题二:Javascript中的函数与变量的关系?

javascript中,函数就是变量,函数体就是变量内容。
javascript执行引擎并非一行一行地分析和执行程序,而是一段一段地分析执行的。在同一段程序分析执行中,定义式的函数语句会被提取出来优先执行。
函数定义执行完之后,才会按照顺序执行其他语句代码。

案例一:

<script type="text/javascript">
function myfunc(){
alert("hello");
}
myfunc(); function myfunc(){
alert("yeah");
}
myfunc();
</script>

这段代码两次执行结果都是yeah,这就验证了刚才所说的了。前面的函数被后面覆盖了。

案例二:

<script type="text/javascript">
function myfunc(){
alert("hello");
}
myfunc();
</script>
<script type="text/javascript">
function myfunc(){
alert("yeah");
}
myfunc();
</script>

就会先执行hello,然后执行yeah了。因为分成两段,就一段一段执行了。这里要能去想象javascript解释器的工作机制。

案例三:

<script type="text/javascript">
function myfunc(){
alert("hello");
}
myfunc();
var myfunc = function(){
alert("yeah");
}
myfunc();
</script>

会先hello,然后yeah,为什么呢。因为第二个是定义变量的方式定义函数,不会优先执行。所以不会覆盖掉之前的函数。

话题三:javascript作用域?

var myName = "zhang";
就定义了window作用域的一个变量myName。
myName = "zhang";
就定义了window对象的一个属性myName。
两者几乎没有区别。对于全局的Javascript语句来说,加不加"var"都无所谓,但是对于一个函数体,就有区别了。
案例:

<script type="text/javascript">
var yourName = '王菲';//定义变量
myName = 'Jim';//定义属性
alert(myName+" like "+yourName);//输出"Jim like 王菲"
ChangeNames();
function ChangeNames(){
alert("Your old name is "+yourName);//输出"Your old name is undefined"
alert("My old name is "+myName);//输出"My old name is Jim"
var yourName = "李亚鹏";
myName = "JiQing";
alert(myName+" like "+yourName);//输出"JiQing like 李亚鹏"
}
alert(myName+" like "+yourName);//输出"JiQing like 王菲"
</script>

这里面可以看出,定义成var的格式,函数里的yourName与函数外的yourName没有关系。
而没有定义成var的格式,函数里的变量和外的是相关联的,是一个东西,里面变化了,外面也收到影响。
比如myName。
当代码运行进入一个函数时,Javascript会创建一个新的作用域。变量名最好加个"var",这样作用域不容易产生混淆。

话题四:函数和对象

1.任何一个函数都可以为其动态地添加或去除属性。函数具有对象性。

案例:

<script type="text/javascript">
function Sing(){
alert(Sing.author+" : "+Sing.poem);
}
Sing.author = "李白";
Sing.poem = "汉家秦地月,流影照明妃。一上玉关道,天涯去不归。";
Sing();//输出"李白:汉家秦地月,流影照明妃。一上玉关道,天涯去不归。"
Sing.author = "李战";
Sing.poem = "日出汉家天,月落阴山前。女儿琵琶怨,已唱三千年。";
Sing();//输出"李战:日出汉家天,月落阴山前。女儿琵琶怨,已唱三千年。"
</script>

2.对象和函数的波粒二象性,即有数组的特点又有对象属性的特点

案例:

<script type="text/javascript">
var anObject = {};
anObject.aProperty = "Property of object";
anObject.aMethod = function(){
alert("Method of object");
}
alert(anObject["aProperty"]);//输出"Property of object"
anObject["aMethod"]();//输出"Method of object"
alert(anObject.aProperty);//输出"Property of object"
anObject.aMethod();//输出"Method of object"
</script>

既可以以数组的方式输出,又可以以对象属性的方式输出。

话题五:this关键字

在Javascript函数中,你只能把this看成当前服务的"这个"对象。

<script type="text/javascript">
function WhoAmI(){
alert("I'm "+this.name+" of "+typeof(this));
}
WhoAmI();//this是window
var BillGates = {name:"Bill Gates"};
BillGates.WhoAmI = WhoAmI;//将函数WhoAmI作为BillGates的方法
BillGates.WhoAmI();//this是BillGates var SteveJobs = {name:"SteveJobs"};
SteveJobs.WhoAmI = WhoAmI;
SteveJobs.WhoAmI();//this是SteveJobs WhoAmI.call(BillGates);//直接将BillGates作为this,调用WhoAmI
WhoAmI.call(SteveJobs);//直接将SteveJobs作为this,调用WhoAmI BillGates.WhoAmI.call(SteveJobs);//this是SteveJobs,调用BillGates的WhoAmI方法
SteveJobs.WhoAmI.call(BillGates);//this是BillGates,调用SteveJobs的WhoAmI方法 WhoAmI.WhoAmI = WhoAmI;//将函数WhoAmI作为WhoAmI的方法
WhoAmI.name = "WhoAmI";
WhoAmI.WhoAmI();
</script>

悟透Javascript undefined,null,"",0这四个值转换为逻辑值时就是false &this关键字的更多相关文章

  1. 悟透javascript读书笔记

    1.undefined,null,0,""  这四个值转换为逻辑值时是false,其他无论简单类型值,对象或者函数转换过来都是true 2.如图 第一个是“声明了一个变量,给变量赋 ...

  2. Javascript代码执行过程-《悟透Javascript》笔记

    本文摘录自李战老师<悟透Javascript>一书的部分章节,为适应博客发表作了一点点修改. 1) 预编译分析. JavaScript执行引擎将所有定义式函数直接创建为作用域上的函数变量, ...

  3. javascript中的undefined,null,"",0和false的云集

    在各种各样的数据类型中,我们都会为其定义一个"空值"或"假值",比如对象类型的空值null,.NET Framework中数据库字段的空值DBNull,bool ...

  4. (转载)悟透JavaScript

    引子 编程世界里只存在两种基本元素,一个是数据,一个是代码.编程世界就是在数据和代码千丝万缕的纠缠中呈现出无限的生机和活力. 数据天生就是文静的,总想保持自己固有的本色:而代码却天生活泼,总想改变这个 ...

  5. 悟透JavaScript

    要理解JavaScript,你得首先放下对象和类的概念,回到数据和代码的本原.前面说过,编程世界只有数据和代码两种基本元素,而这两种元素又有着纠缠不清的关系.JavaScript就是把数据和代码都简化 ...

  6. 悟透JavaScript(理解JS面向对象的好文章)

    引子 编程世界里只存在两种基本元素,一个是数据,一个是代码.编程世界就是在数据和代码千丝万缕的纠缠中呈现出无限的生机和活力. 数据天生就是文静的,总想保持自己固有的本色:而代码却天生活泼,总想改变这个 ...

  7. 悟透JavaScript (一)

    首先说明,这是别人写的一篇文章,写得很好,对理解JavaScript很有好处,所以转帖过来. 引子    编程世界里只存在两种基本元素,一个是数据,一个是代码.编程世界就是在数据和代码千丝万缕的纠缠中 ...

  8. 区分JS中的undefined,null,"",0和false

    在程序语言中定义的各种各样的数据类型中,我们都会为其定义一个"空值"或"假值",比如对象类型的空值null,.NET Framework中数据库 字段的空值DB ...

  9. 悟透JavaScript(二)

    初看原型 prototype源自法语,软件界的标准翻译为“原型”,代表事物的初始形态,也含有模型和样板的意义.JavaScript中的prototype概念恰如其分地反映了这个词的内含,我们不能将其理 ...

随机推荐

  1. skynet网络库socket-server

    最近在读大神云风的开源服务器架构skynet,其中的网络库,云风已经单独开来,可以独立使用. 开源地址: https://github.com/cloudwu/socket-server 网络库已经封 ...

  2. ORA-00928: 缺失 SELECT 关键字

    ORA-00928: 缺失 SELECT 关键字 一般是表的列名使用了关键字,解决办法就是加双引号 来自为知笔记(Wiz)

  3. app抓包

    http://www.360doc.com/content/14/1126/11/9200790_428168701.shtml 记得下载证书  不然有些网站是抓不到的

  4. Python实战:美女图片下载器,海量图片任你下载

    Python应用现在如火如荼,应用范围很广.因其效率高开发迅速的优势,快速进入编程语言排行榜前几名.本系列文章致力于可以全面系统的介绍Python语言开发知识和相关知识总结.希望大家能够快速入门并学习 ...

  5. 用bootstrap的tab插件做一个图层切换效果(感觉会误导淫们,大家当乐子看吧)

    小伙伴们啊,我JS真的是个渣渣,所以总想要偷懒,于是为了实现效果就把tab插件给改了(各位大神轻拍啊,我是小白,很纯洁滴,小心脏也很脆弱)…… 最近做的项目为了考虑以后的移动设备兼容性,所以用了Boo ...

  6. React+Immutable.js的心路历程

    这段时间做的项目开发中用的是React+Redux+ImmutableJs+Es6开发,总结了immutable.js的相关使用姿势: Immutable Data 顾名思义是指一旦被创造后,就不可以 ...

  7. mvc5 + ef6 + autofac搭建项目(repository+uow)(二)

    续上篇: DBContext 在上篇 图一类库根目录创建的 DbContextBase /// <summary> /// 数据库上下文基类 /// </summary> // ...

  8. C#常用的关键字

    常用关键字有 this 1)当前类的对象 2)调用自己的构造函数 new base virtual interface abstract override parttial sealed return ...

  9. html本地存储尝试

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  10. LPC1114

    时钟配置: 3个时钟源:系统振荡源(system),IRC振荡源,(IRC,内部RC振荡器)看门狗振荡源(WatchDog) MAINCLKSEL:主时钟源选择寄存器(复位值:0) 只用了前两位: 0 ...