js零碎笔记
1、在包含加法运算符的数字和字符串表达式中,JavaScript 会把数字值转换为字符串。在包含其它运算符(译注:如下面的“-”)时,JavaScript语言不会把数字变为字符。
console.log("this is a test" + 1); //this is a test1
console.log("37"-7); //30
2、在JavaScript语言中,一个标识符必须以字母、下划线(_)或者美元($)符号开头;后续的字符可以包含数字(0-9)。因为JavaScript语言是区分大小写的,这里所指的字母可以是(大写的)“A”到字母“Z”和(小写的)“a”到“z”。
3、用var声明时未赋初值的变量,值会被设定为undefined。
在JavaScript中,undefined这个词有多重含义.首字母大写的Undefined表示的是一种数据类型,小写的undefined表示的是属于这种数据类型的唯一的一个值.但这两种undefined都只能存在于文档或规范中,不能 存在于JavaScript代码中.在JavaScript代码中,你看到的undefined最有可能是全局对象的一个属性
,该属性的初始值是就是前面所说的原始值undefined
,还有种情况就是,这个undefined
是个局部变量,就像其他普通变量一样,没有任何特殊性,它的值不一定是undefined
,但通常情况下都是的.下面我们所说的undefined
,都指的是window.undefined
这个属性.
在ES3中(Firefox4之前),window.undefined
就是一个普通的属性,你完全可以把它的值改变成为任意的真值,但在ES5中((Firefox4之后),window.undefined
成了一个不可写,不可配置的数据属性,它的值永远是undefin
var num ; console.log(num); //undefined
4、undefined
值在布尔类型环境中会被当作false。undefined派生自null。
var num = undefined; console.log(Boolean(num)); //false
5、数值类型环境中
undefined
值会被转换为NaN
(译注:NaN为“Not a Number”,不是一个数字,的缩写)。
var num = NaN; var num1 = 5; console.log(num+num1); //NaN
6、值 null
是一个 JavaScript 字面量,表示空值(null or an "empty" value),即没有对象被呈现(no object value is present)。空值null在数值类型环境中会被当作0来对待,而布尔类型环境中会被当作false。
var num1 = null; var num2 = 5; console.log(num1+num2); //5 console.log(Boolean(num1)); //false
7、全局变量实际上是全局对象的属性(在浏览器下就是window对象的一个属性)。
var name = "定海神针"; console.log(window.name); //定海神针
8、在换行之前加上反斜线以转义换行(译注:实际上就是一条语句拆成多行书写),这样反斜线和换行都不会出现在字符串的值中。
var hello = "hello \ world \ !"; console.log(hello); //hello world !
9、位运算符
位运算符将它的操作数视为32位的二进制串(0和1组成)。例如:十进制数字9用二进制表示为1001,位运算符就是在这个二进制表示上执行运算,但是返回结果是标准的JavaScript数值。
10、in
操作,如果指定的属性在指定的对象中会返回true
语法:属性 in 对象
var myarray = new Array("1","2","3","4"); console.dir(myarray);
这是结果:一共有5个属性:
console.log("0" in myarray); //true console.log("5" in myarray); //false 属性里没有5 console.log("length" in myarray); //true
11、typeof和instanceof的目的都是检测变量的类型,两个的区别在于typeof一般是检测的是基本数据类型,instanceof主要检测的是引用类型。
12、逗号操作符(,)对两个操作数进行求值并返回第二个操作数的值。它的优先级别在所有运算符中是最低的,结合方向是“自左至右”的。
var a = 30,b; b = 30,20; console.log(b); //30
为什么是30而不是20,因为=优先级比,高,改为如下就符合我们的预期:
var a = 30,b; b = (30,20); console.log(b); //20
13、null表示"没有对象",undefined表示"缺少值",就是此处应该有一个值,但是还没有定义。null主要在对象操作上用,undefined主要用在变量上。(此处待确认)
14、我们使用一对花括号{}来分组语句块,如下所示:
{
statement_1;
statement_2;
...
statement_n;
}
15、在ECMAScript 6标准之前,Javascript没有块作用域。如果你在块的外部声明了一个变量,然后在块中声明了一个相同变量名的变量,并赋予不同的值。那么在程序执行中将会使用块中的值。示例:
var a = 1; { var a =2; } console.log(a); //2
这段代码的输出是2,这是因为var x=2的作用范围与var x=1的作用范围相同。
16、在if的条件语句中,传递给条件语句时,以下被认为是false:
- false
- undefined
- null
- 0
- NaN
- 空字符串 ("")
所有其他值,包括所有对象会被计算为 true 。注意:Boolean对象被认为是true,而字面量false则是false.
var x = new Boolean(false); if (x) { console.log("true"); //true } if (!false) { console.log("false"); //false }
17、你可以在一个函数里面嵌套另外一个函数。
嵌套(内部)函数是容器(外部)函数的私有成员。它自身也形成了一个闭包。一个闭包是一个可以自己拥有独立的环境与变量的的表达式(通常是函数)。既然嵌套函数是一个闭包,就意味着一个嵌套函数可以继承容器函数的参数和变量。
换句话说,内部函数包含外部函数的作用域。可以总结如下:
- 内部函数只可以在外部函数中访问
- 内部函数形成了一个闭包:它可以访问外部函数的参数和变量,但是外部函数却不能使用它的参数和变量
关于闭包的一个资料:http://blog.csdn.net/yfgcq/article/details/2039477
英文好可以看:http://jibbering.com/faq/notes/closures/
18、对象名首字母大写是非常普遍而且很恰当的惯用法。
19、一段代码,运行结果是什么?
var a = {n: 1}; a.x = a = {n: 2}; console.log(a.x);
运行结果是undefined,我是这么理解这个过程的:
var a = {n:1}; var b =a; console.log( a === b); // true a和b是一个引用 // a.x = a = {n:2}; a = {n:2}; console.log ( a === b ); // false 这个a已经不是上一个a了,是一个新的地址,而b才是上一个a,a和b的指针不同了 a.x ; // 只是定义了一个属性,并没有赋值操作,因为a = {n:2}也是一个定义过程,当然a.x就是undefined // a.x = a = {n:2};相当于var a.x,a={n:2} console.log(a.x);
待续。。。。
如果您觉得此文有帮助,可以打赏点钱给我支付宝ypengfei@163.com,或扫描二维码。