1.var message;   ----这样定义的变量值为undefined

2.去掉var则为全局变量--message = “100”;

3.function fun(){

var message = "100"

}

fun();

alert(message); ---局部变量message在fun()调用之后就会被销毁,所以这个值是undefined。

4.typeof()-----用来检测变量的数据类型

5.undefined/string/null/boolean/number/object----object的值是对象或者null

6.对于未声明的变量使用typeof()也会返回undefined--所以在声明变量的时候尽量显示的定义,当出现undefined的时候就能知道这个变量没有被声明。

7.null从逻辑角度上讲是一个空对象指针(undefined派生自null,undefined == null-->true),对于意在保存对象的变量还没有对象可保存,可以用null代替,可以提现null作为空指针的惯例。

8.boolean--字面值true和false 不一定是0或者1,所有的变量都可以用Boolean()转型函数来检测,该值保存在messageAsBoolean变量中,下面是各种变量的转型结果

数据类型 转换为true的值 转换为false的值
Boolean ttrue false
String 非空字符串 空字符串“”
Number 非零-包括无穷大 0和NAN
Object 任何对象 null
undefined n/a undefined

这些规则对理解控制流程(if语句)的自动执行过程非常重要。

9.Number--整数,浮点数(infiniti-正无穷),NaN

整数:var nu=070;(8进制);var nu = 0x1f(0x代表16进制)

浮点数:小数点前可以没有整数但不推荐,不要做浮点数的精确运算(0.2+0.1不一定等于0.3)

NaN:非数值(not a number)表示一个本来要返回数值的操作却没有返回数值(这样就不会抛出错误)。俩个特点:任何涉及NAN的都会抛出NAN,NAN和任何值都不相等,包括NAN本身

Number()函数

1.boolean返回1或者0;
2.null返回0;
3.undefined返回NAN;
4.字符串则会忽略前导和后置的0,为空则返回0,其他则返回NAN
5.对象--

parseInt:parseInt("100",2) //用二进制解析

parsefloat:只能解析10进制数

10.string--单引号和双引号表示的字符串相同

string包含一种特别的字面量-字符字面量 \n 换行 \b空格 \unnnn表示一个unicode字符等可以出现在任意位置,会被当做一个字符。

tostring()--null和undefined没有这个方法

string()--如果有tostring()方法则调用,null和unde返回自身

11.object--用new来创建-object类型是所有实例的基础,换句话说,object所具有的属性和方法也同样存在于更具体的实例中。

object每个实例都具有的属性和方法
1.constructor--保存用来创建当前对象的函数。
2.hasOwnproperty--检查给定的属性在当前实例中是否存在
3.isPrototypeof--用于检查传入的对象是否是另一个对象的原型
4.tostring();
5.valueof();
6.propertyIsenumerable-检查给定的属性能否使用for-in
7.在IE中,只有开发人员定义的对象才能继承object

12.

变量-基本类型保存在栈内存中,引用类型保存在堆内存中,复制基本变量会在栈内存中增加一个值,复制引用类型中只是单纯的指针指引到堆内存上的引用类型上,引用的还是同一个引用类型

13.

函数参数按值传递:基本类型的按值传递很好理解,就是把值复制给了参数,但是引用类型的值传递就不太好理解,我的理解就是这个引用类型的值是指变量地址(指针指向堆内存的数组和对象等)的值,如果给堆内存的对象赋值的话其变量地址的值会改变,和原所指的引用类型的变量地址值不相同了

(看的一篇文章:http://www.cnblogs.com/imlucky/archive/2012/11/10/2763949.html)

var v1 = []
var v2 = {};
var v3 = {};
function foo(v1, v2, v3)
{
    v1 = [1];
    v2 = [2];
    v3 = {a:3}
}

foo(v1, v2, v3);
alert (v1); // 空白
alert (v2); // [object Object]
alert (v3.a); // undefined

由此可见:v1、v2、v3 都没有被改变,v1 仍然是零个元素的数组,v2、v3 仍然是空白的对象。

但是,数组、对象等按值传递,是指变量地址的值。

数组、对象等的按值传递与数字、字符串还是有所不同的。数字、字符串是把值直接复制进去了,而数组、对象是把变量地址复制进去的。

前面我们让 v1、v2、v3 作为参数进入函数后,就有了地址副本,这些地址副本的指向和外面的 v1、v2、v3 的地址指向是相同的。但我们为 v1、v2、v3 赋了值,也就是说我们把地址副本的指向改变了,指向了新的数组和对象。这样内部的 v1、v2、v3 和外部的 v1、v2、v3 就完全断了。

如果我们不赋新值,而是直接操作它,那么,它操作到的,仍然是和外面的 v1、v2、v3 指向的同一块数组或对象。

var v1 = []
var v2 = {};
var v3 = {a:0};
function foo(v1, v2, v3)
{
    v1.push (1);
    v2.a = 2;
    v3.a = 3;
}

foo(v1, v2, v3);
alert (v1); // 1
alert (v2.a); // 2
alert (v3.a); // 3

javascript-变量-作用域的更多相关文章

  1. 【转】javascript变量作用域、匿名函数及闭包

    下面这段话为摘抄,看到网上大多数人使用的是变量在使用的时候声明而不是在顶端声明,也可能考虑到js查找变量影响性能的问题,哪里用就在哪里声明,也很好. 在Javascript中,我们在写函数的时候往往需 ...

  2. 第一百零六节,JavaScript变量作用域及内存

    JavaScript变量作用域及内存 学习要点: 1.变量及作用域 2.内存问题 JavaScript的变量与其他语言的变量有很大区别.JavaScript变量是松散型的(不强制类型)本质,决定了它只 ...

  3. JavaScript 变量作用域

    一. 变量声明 变量用var关键字来声明,如下所示: 变量在未声明的情况下被初始化,会被添加到全局环境. JavaScript执行代码时,会创建一个上下文执行环境,全局环境是最外围的环境.每个函数在被 ...

  4. JavaScript变量作用域

    全部变量拥有全局作用域,局部变量拥有局部作用域(这里注意函数的参数也是局部变量) 1.在函数体内,局部变量的优先级高于同名的全局变量. 我的理解就是当你同时定义了同名的局部变量和全局变量时,函数体内返 ...

  5. 深入理解Javascript变量作用域

    在学习JavaScript的变量作用域之前,我们应当明确几点: a.JavaScript的变量作用域是基于其特有的作用域链的. b.JavaScript没有块级作用域. c.函数中声明的变量在整个函数 ...

  6. JavaScript 变量作用域 详解

    变量作用域要点 - 在JavaScript中没有块级作用域,只有函数作用域 - 在函数体内,局部变量的优先级高于同名的全局变量 - 在全局作用域编写代码时可以不写var语句,但声明局部变量时必须使用v ...

  7. JavaScript变量作用域(Variable Scope)和闭包(closure)的基础知识

    在这篇文章中,我会试图讲解JavaScript变量的作用域和声明提升,以及许多隐隐藏的陷阱.为了确保我们不会碰到不可预见的问题,我们必须真正理解这些概念. 基本定义 作用范围是个“木桶”,里面装着变量 ...

  8. 基础系列(1)之干掉JavaScript变量作用域

     今天去某顺公司面试,发现一些基础知识都不记得了,于是乎决定把js基础系列的全部梳理一遍,今天就整理下js变量作用域的相关基础知识点,配合最常遇到的笔试题阐述. 题一: var g = "a ...

  9. 深入浅出JavaScript变量作用域

    在学习JavaScript的变量作用域之前,我们应当明确几点: JavaScript的变量作用域是基于其特有的作用域链的. JavaScript没有块级作用域. 函数中声明的变量在整个函数中都有定义. ...

  10. JavaScript 变量作用域和声明提升

    一.变量作用域 说到这个概念,不有自主的想到this,scope 这两个关键字. JavaScript的this总是指向一个明确的对象,这个对象是在执行的时候动态绑定的.通俗的说就是谁调用我,我的th ...

随机推荐

  1. crontab使用和格式

    什么是crontab crontab命令常见于Unix和类Unix的操作系统之中,用于设置周期性被执行的指令.具体的用法见下图: 关于crontab的格式: crontab的格式是分为6列:f1 f2 ...

  2. ZEN_CART_如何添加自定义页面

    按照下面的路径,添加自己的文件,就OK了 以about us页面为例, 默认模板 \includes\templates\template_default\templates\tpl_about_us ...

  3. C语言中的几种常见排序算法

    1.冒泡排序法:如果有N个数,两两相邻进行比较,将最值沉入最后一位置,要进行N-1轮比较, 第一轮要比较N-1次,第2轮只要比较N-1-1次,因为第一次已经把最值沉入最后一位置,故 不需在进行比较一次 ...

  4. HDU 3726 Graph and Queries 平衡树+前向星+并查集+离线操作+逆向思维 数据结构大综合题

    Graph and Queries Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Other ...

  5. [转]PHP经验——PHPDoc PHP注释的标准文档

    文档翻译自:http://en.wikipedia.org/wiki/Phpdoc 标记 用途 描述 @abstract   抽象类的变量和方法 @access public, private or ...

  6. JSP标签编程--简单标签

    javax.servlet.jsp.tagext里的类SimpleTagSupport 使用SimpleTagSupport类一网打尽以往复杂的标签开发,直接使用doTag()方法 java文件: p ...

  7. zabbix企业应用之bind dns监控(转)

    继续介绍zabbix监控企业应用的实例,本次介绍zabbix监控dns,我监控的dns为bind 9.8.2,本dns为公网dns,是为了解决公司内网服务器自动化所需求的dns解析,比如目前的pupp ...

  8. log4j输出到指定日志文件

    log4j.properties: log4j.logger.myTest=DEBUG,console,FILE log4j.appender.console=org.apache.log4j.Con ...

  9. USACO Section 1.2 Milking Cows 解题报告

    题目 题目描述 有3个农夫每天早上五点钟便起床去挤牛奶,现在第一个农夫挤牛奶的时刻为300(五点钟之后的第300个分钟开始),1000的时候结束.第二个农夫从700开始,1200结束.最后一个农夫从1 ...

  10. CentOS 7 x64 docker 使用点滴

    CentOS 7 安装 docker yum search docker  查看是否 有docker包 yum info docker  版本为1.3.2 yum -y install docker ...