• 关于 '0' === 0 浅析


    首先,先来科普一下,Javascript的数据类型(六种):

    1、数值(number):整数和小数(比如1和3.14)

    2、字符串(string):字符组成的文本(比如”Hello World”)

    3、布尔值(boolean):true(真)和false(假)两个特定值

    4、undefined:表示“未定义”或不存在,即由于目前没有定义,所以此处暂时没有任何值

    5、null:表示无值,即此处的值就是“无”的状态

    6、对象(object):各种值组成的集合

    再来看看数据类型的转换:

    // 数值:转换后还是原来的值
    Number(324) // 324

    // 字符串:如果可以被解析为数值,则转换为相应的数值
    Number('324') // 324

    // 字符串:如果不可以被解析为数值,返回NaN
    Number('324abc') // NaN

    // 空字符串转为0
    Number('') // 0

    // 布尔值:true 转成1,false 转成0
    Number(true) // 1
    Number(false) // 0

    // undefined:转成 NaN
    Number(undefined) // NaN

    // null:转成0
    Number(null) // 0

    Number函数将字符串转为数值,要比parseInt函数严格很多。基本上,只要有一个字符无法转成数值,整个字符串就会被转为NaN。

    parseInt('42 cats') // 42
    Number('42 cats') // NaN

    嗯,回归到今天的主题,现在判断一下

    '0' === 0

    在Chrome里输出的结果是

    '0' === 0 //false

    因为字符串类型和数值类型永远都不会严格的等于,而如果你输入:

    '0' == 0

    在Chrome里输出的结果是

    '0' == 0 //true


    一个字符串为了和一个数字进行比较,必须事先被强制转换为数字,所以'0'==0是相等的。但'0' === 0是不会严格的等于的。

    强烈推荐使用严格等于操作符。如果类型需要转换,应该在比较之前显式的转换, 而不是使用语言本身复杂的强制转换规则。

    最近在与后台进行数据交互的时候,遇到一个问题,找了很久,期间后台传给我的数据是

    "exchangeList":[
    {
    "id":27,
    "userid":"4797877",
    "phonenum":"15967122745",
    "state":"2",
    "createtime":"2017-08-31 19:09:26",
    },
    ]

    我前端将数据循环后渲染到页面时使用的vue框架;
    假设我们把变量什么的都定义好了,我需要获取到state的状态;

    html

    <table class="table table-bordered table-hover text-center" id="tabletList">
    <tbody>
    <tr v-for="(x, index) in prizeList">

    <td v-if=“x.state === 0">
    未发放
    </td>
    <td v-else-if="x.state === 1 ">
    发放中
    </td>
    <td v-else>
    已发放
    </td>
    <td>
    <a href="javascript:;" @click="modify(index)" class="curEdit">修改</a>
    </td>
    </tr>
    </tbody>
    </table>

    弹窗的内容

    <!-- 修改弹框 -->
    <sweet-modal ref="dialog" class="dialog">
    <h3>修改获品状态</h3>
    <table class="editTd">
    <tbody>
    <tr>
    <td>奖品id</td>
    <td>
    <input readonly="readonly" v-model="current.id" type="text" class="form-control iptText" >
    </td>
    </tr>
    <tr>
    <td>发放状态:</td>
    <td>
    <select class="form-control" v-model="current.state">
    <template v-for="(x,index) in states">
    <option :value="index"
    v-text="x" v-if=" 'index' === current.state" selected
    >
    </option>
    <option :value="index"
    v-text="x" v-else
    ></option>
    </template>
    </select>
    </td>
    </tr>
    </tbody>
    </table>
    <button @click="cancel" type="button" class="btn btn-default">取消</button>
    <button @click="submit" type="button" class="btn btn-danger">确定</button>
    </sweet-modal>

    js

    modify(i) {//点击修改 弹框显示当前列表的信息
    this.current.id = this.prizeList[i].id
    this.current.state = this.prizeList[i].state
    this.index = i
    this.$refs.dialog.open()
    },

    submit() {//确定时提交弹窗
    const i = this.index
    this.$refs.dialog.close()
    api.getUpdateExchange(this.current.id, this.current.state)
    .then( res => {

    window.opener=alert('修改成功更新成功!')

    const item = this.prizeList[this.index]
    item.state = this.current.state
    item.id = this.current.id
    this.$set(this.prizeList, this.index, item)

    })
    },


    现在的问题是点击修改时,弹框里的select的option的值没有显示当前列表里的内容,对于这个问题
    首先问题应该出在modify()这个方法里,没有等于当前的状态,那就是没有我在html里写的判断语句,回过头来看看

    <tr>
    <td>发放状态:</td>
    <td>
    <select class="form-control" v-model="current.state">
    <template v-for="(x,index) in states">
    <option :value="index"
    v-text="x" v-if=" index === current.state" selected
    >
    </option>
    <option :value="index"
    v-text="x" v-else
    ></option>
    </template>
    </select>
    </td>
    </tr>

    这里判断了v-if=" index === current.state" selected,如果当前的index === current.state时才会执行selected

    当是后台给我的json数据是{"state":"2",},也就是说state的value中的2是字符串(string)类型,
    而我本地判断的时候,index的值时数值类型(Number),那这样那个判断语句是不会执行的。

    知道错误之后,我修改了下代码

    <tr>
    <td>发放状态:</td>
    <td>
    <select class="form-control" v-model="current.state">
    <template v-for="(x,index) in states">
    <option :value="index"
    v-text="x" v-if=" index == current.state" selected
    >
    </option>
    <option :value="index"
    v-text="x" v-else
    ></option>
    </template>
    </select>
    </td>
    </tr>

    把‘===’改成了‘==’,在最开始的时候已经说过了,字符串==数值 的时候,在其间字符串必须事先被强制转换为数字,所以‘0’ == 0//true,
    原本这样改为之后应该就能实现我们想要的效果了,但是好像事与愿违。

    这样还是不行那就应该是在一开始初始化的时候的问题了,看看页面的html

    <table class="table table-bordered table-hover text-center" id="tabletList">
    <tbody>
    <tr v-for="(x, index) in prizeList">

    <td v-if=“x.state === 0">
    未发放
    </td>
    <td v-else-if="x.state === 1 ">
    发放中
    </td>
    <td v-else>
    已发放
    </td>
    <td>
    <a href="javascript:;" @click="modify(index)" class="curEdit">修改</a>
    </td>
    </tr>
    </tbody>
    </table>
    还是同样的错,当数据循环出来之后,在之前都知道了state是字符串,而我到html页面中的时候使用的是‘===’(严格等于),那这样就只能把 x.state===1 其中的某一项转成字符串(string)或者数值(Number)类型就OK了。

  • 相关阅读:
    DIV+CSS规范命名大全集合
    display:none与visibility:hidden的区别
    为什么无法发起qq临时会话,必须添加好友?如何设置才能临时会话?
    gif动态图片去白边,杂边
    【原创】[PS技巧]如何制作翘角纸条的阴影效果
    ......那么Win8.1怎么去掉文件夹?
    Win8增加了快速启动功能......
    不间断图片滚动JS
    FlatList
    react native 布局
  • 原文地址:https://www.cnblogs.com/wendy-home-5678/p/7465768.html
Copyright © 2020-2023  润新知