//Js基本语法
值类型---数据类型
不可改变的原始值(栈数据) number string boolean undefined(声明了变量未赋值) 例如:var a; //a自动被赋值为undefined
null(表示一个变量将来可能指向一个对象。)
引用值(堆数据)
array object function
原始值为什么是不可改变的呢,假如先给num赋值100,后改成200,原来的房间的名字改成1011,值不会改变,重新创建一个房间命名为num并赋值200
原始值和原始值比对的是值,引用值比较的是地址,地址一样才相等
比如这样是相等的:
首先看以下概念
根据数据类型的的不同,有的变量存储在栈中,有的存储在堆中。
原始变量类型及他们的值存储在栈中,当吧一个原始变量传递给另一个原始变量时,是把一个一段栈空间的内容复制到另一段栈空间,这两个原始值互相不影响。
引用值是把引用变量的名称存储在栈中,但是把其实际对象存在堆中,且存在一个指针有变量名指向存储在堆中的实际对象,当吧引用对象传递给另一个变量时,复制的其实是指向实际对象的指针,此时,若通过方法改变其中一个变量的值,则访问另一个变量时,其值也会随之加以改变;但若不通过方法,而是通过重新赋值 此时 相当于 重新开了一段内存 该值的原指针改变 ,则另外一个 值 不会随他的改变而改变。
原始值不能被改变
一:js的赋值
看这几行代码:
<script type="text/javascript">
//document.write("hello worldss");
var arr=[1,2];
var arr1=arr;
arr.push(3);
alert(arr);
alert(arr1);
</script>
输出是1,2,3和1,2,3
为什么呢?可以看这张图
arr1指针指向和arr相同的堆,当arr再赋值3进入后,arr和arr1的值都变为1,2,3
再看第二段代码
<script type="text/javascript">
//document.write("hello worldss");
var arr=[1,2];
var arr1=arr;
arr.push(3);
arr=[1,3];
alert(arr);
alert(arr1);
</script>
输出是1,3和1,2,3
重新开辟一个内存,存入1,3,然后arr的指针指向1002
下面这个例子为什么第一种写法会报错呢,是因为.的执行顺序优先,会首先以为123.是浮点型,浮点型后面不能加字母,所以就报错了,另外数字怎么会有toString()方法呢,见原型包装类和原型链的文章
加号(+)可以是求和也可以是字符串连接 var a=1+1+"a"+(1+2) a为2a3
反正应该得出数字类型的值但是又没法表示的会返回NaN(not a number) 比如var a=0/0
运算顺序为先执行等号右边的,a+1为11再赋给a,赋值的顺序自右向左,计算的顺序自左向右
&&运算符的使用
碰到假就停
比如说var a=1&&2 1为真直接返回2 不会返回true的,因为2的布尔值为真,所以是真,如果是var a=1&&0因为1为真直接返回0,0的布尔值为假。且后面的+2也不会执行
如果第一个表达式为false,直接返回第一个值不再往后走 var a=0&&2 返回0 0转换为布尔值是假
那么&&代表只要有一个为假就是假,全真才为真,因为假如第一个表达式为假返回的也是假,如果第一个为真,第二个为假,因为第一个表达式为真会直接返回第二个表达式,因为第二个表达式为假所以还是假。
如果是三个表达式 碰到假就立刻返回 不会再执行,为真就继续执行
如果不关注它的返回值,可以作为短路语句,if的简写形式
有时候后端传过来的数据不一定能用,直接写会报错,我们可以用&&判断一下,正确才执行我们的语句,比如传参,传过来才执行
||或运算符
碰到真就停 ,第一个是真就直接返回,碰到真就返回,不往后看,碰到假就往后看,如果是两个表达式第一个为假就返回第二个。
用法可写兼容
!非运算符
undefined ,null, NaN ,""(空串),0, false布尔值都是false
非运算符都是转换为布尔值再取反
if括号里不是为false的那六个值,那条件就成立会往下执行。这个函数当完条件之后自己也产生了变化,括号里会把里面的东西变为表达式,变为表达式之后就不是函数定义了,f函数从此消失;了。打印的结果是1undefined 这里不会报错是因为任何未定义的变量只有在type of后面才不会报错,然后返回的“undefined”是字符串形式,+是字符串连接,所以结果是1undefined