javascript基本操作及原理学习

 /*
 临时对象测试
   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>
原文地址:https://www.cnblogs.com/smallbrokenchildwen/p/7158005.html