zoukankan      html  css  js  c++  java
  • 区分,转化字符串与对象

    今天碰到一个问题,ajax请求程序后,返回的结果:{a:1,b:2},程序员说是对象,但是我得到的结果是string,最后用eavl来转化,然后从这里面学到了以下两点知识:

    1.字符串与对象的区分

    '{a:1}|{b:2}'.split('|')[0]得到的是字符串,原因是:数组里面每个项是由'{a:1}|{b:2}'这个字符串转化成的,所以里面每个项都是字符串。字符串转化成数组时,数组项还是字符串

    [{a:1},{b:2}][0]得到的是object

    2.eavl()的使用

    eval()接受一个参数,如果这个参数不是字符串的话,直接近返回该参数,如果是字符串的话,就执行这个这个字符串,执行结果后能得到值的话就直接返回,否则就返回undefined,如果参数是对象语句{a:1}的话,则不能返回该对象,如果想返回对象的话,必须将{a:1}这个语句转化为表达式:例 下面:

    eavl('{a:1}')是执行,得到1,将里面的内容当成是一段代码执行了,没有返回值

    eavl('('+{a:1}+')'),eavl会将里面的内容当成object解析,返回的结果是object

    eval()函数有个特点,他总是在调用他的上下文变量内执行,无论是变量定义还是函数定义都是如此

    var s='function test(){return 1;}';     //一个函数定义语句

      function demo2(){

      eval(s);

      }

      demo2();

      alert(test());    //->error:test is not defined

      这是因为test函数在局部空间定义,demo2函数内可以访问到,外面就访问不

    到了。

      而在实际的Ajax开发中,有时我们需要从服务器动态获取代码来执行,以减

    轻一次载入代码过多的问题,或者是一些代码是通过Javascript自身生成的,希

    望用eval函数来使其执行。

      但这样的动态获取代码的工作一般在函数内完成,比如:

      function loadCode(){

      var code=getCode();

      eval(code);

      }

      可见eval不可能在全局空间内执行,这就给开发带来了不少问题,也看到过

    很多人为此郁闷。

      不过现在偶终于找到了解决办法,嘿嘿,可以同时兼容IE和Firefox,方法如

    下:

      var X2={}    //my namespace:)

      X2.Eval=function(code){

      if(!!(window.attachEvent && !window.opera)){

      //ie

      execScript(code);

      }else{

      //not ie

      window.eval(code);

      }

      }

      现在如果要想在函数内定义全局代码,就可以通过调用X2.Eval(code)方法,

    一个例子如下:

      var s='global';

      function demo3(){

      X2.Eval('var s="local"');

      }

      demo3();

      alert(s); //->'local'

      可见,在demo3函数内重新定义了全局变量s="local"。

      需要注意的是X2.Eval并不返回值,如果要进行表达式的求值,还是用系统的

    eval函数。X2.Eval设计为仅做全局代码定义用。

      其实看到这里,或许有人感觉问题也太容易解决了点,呵呵,但发现这个办

    法倒是需要些运气和技巧的:

      (1)对于IE浏览器,默认已经提供了这样的函数:execScript,用于在全局

    空间执行代码,只是知道的人还不多。

      (2)对于Firefox浏览器,直接调用eval函数,则在调用者的空间执行;如

    果调用       window.eval则在全局空间执行。这个知道的人估计就更少了。毕

    竟alert(eval==window.eval)返回true!

  • 相关阅读:
    HDU5792 World is Exploding(树状数组)
    POJ3415 Common Substrings(后缀数组 单调栈)
    POJ2406 Power Strings(KMP,后缀数组)
    HDU5489 Removed Interval(动态规划)
    HDU1899 Sum the K-th's(树状数组)
    Codeforces Round #363 Fix a Tree(树 拓扑排序)
    数组-07. 求一批整数中出现最多的个位数字
    数组-06. 找出不是两个数组共有的元素
    数组-05. 字符串字母大小写转换
    数组-04. 查找整数
  • 原文地址:https://www.cnblogs.com/xiaohui108/p/2143184.html
Copyright © 2011-2022 走看看