/* 临时对象测试 js中临时对象在引用后就会被销毁 */ function onClick() { var s="hello world"; var word=s.substring(s.indexOf(" ")+1,s.length); //alert(word); var s="test"; s.len=4; console.log("s.len=:",s.len);//输出:undefined var t=s.len; // alert(t); var t=s.len=4; console.log("s.len= ",t);//4 console.log("s.len= ",s.len);//undefined var s="test",b=1,c=true; var S=new String(s); var B=new Number(b); var C=new Boolean(b); console.log("s",S);//==时 s和S是相同的,而在===全等于时,二者就不相同,因为s是String类型,S为Object对象。 console.log("isTrue",s===S?true:false);//false console.log("isTrue",s==S?true:false);//true console.log("s",typeof(s));//String console.log("s",typeof(S));//Object //js中的原始值是无法被更改的,任何情况下都不行,如果调用其它方法,他会重新生成一个 //对象的值可以被更改 var h="hello"; console.log("toUpper",h.toUpperCase());//"HELLO" console.log("h",h);//"hello" var o={x:1}; console.log(typeof(o)); console.log("o.x",o.x); o.x=2; console.log("o.x",o.x); o.y=3;//为对象o生成一个新的属性并赋值 console.log("o.x",o.x); console.log("o.y",o.y); var a=[1,2,3]; a[0]=0; a[3]=4; //对象为引用类型,任何情况下的将a赋给b,对象本身并没有复制一次,仅仅是赋值的引用值,个人理解:这种赋值二者的基地址是相同的,所以二者全等。 var a=[]; var b=a; b[0]=1; console.log(a[0]); console.log("isTrue?",a===b?true:false); typechange(); } function typechange() { var s=10+"objects";//10转换成字符串 var sum="7"*"4";//两个均转化为数字; var n=1-"x";//=>NaN ,字符"x"无法转换成数字 console.log(n); n+="objects";//=>objects无法转换为数字 console.log(s,sum,n); } function onDown() { /* 各种类型转换为字符串 toString() */ var b=new Boolean(false); console.log("b",b); console.log([1,2,3].toString());//1,2,3 console.log((function(x){f(x); }).toString());//function (x){f(x); } console.log(new Date(2017,0,1).toString());//Sun Jan 01 2017 00:00:00 GMT+0800 /* valueOf() 转换为实际的对象 不会返回原始值 */ var ob={x:1}; console.log("ob=",ob.valueOf())//ob= [object Object] var d=new Date(2017,1,9); console.log("d==",d.valueOf());//1486569600000转换为1970年以来js的内部表示值 以毫秒表示日期 var a=checkScope(); console.log("checkScope:",a); } scope="glocal"; function checkScope() { //scope="local"; //myscope="local"; console.log("scope",scope); //return [scope,myscope]; } /* eval()具有改变全局变量的能力, 但是定义别名调用它时,eval会把字符串当作顶层的全局变量来执行。 就是说如果在函数中用别名来对一个全局变量进行eval操作时,执行的代码会定义新的全局变量和全局函数,或者 给全局变量赋值,但却不能使用或者修改主调函数中的局部变量,因此不会影响到函数内的优化 个人理解:利用别名来操作全局变量时,函数内返回全局变量不会改变,或者称为新的全局变量,而全局变量本身会 把函数内对全局变量进行操作的方法当作顶层的全局变量来执行,所以函数内返回全局变量未更改,但是全局变量本身更改。 */ var geval=eval; var x="global",y="global"; function f() { var x="local"; eval("x+='changed';"); return x; } function g() { var y="local"; geval("y+='changed';"); return y; } console.log(f(),x);//localchanged global console.log(g(),y);//local globalchanged </script>