两个不同的输出使用+ vs,连接方法

时间:2017-03-05 12:59:10

标签: javascript concatenation

在MDN网站上处理此示例时,解释了过滤方法:

var arr = [
  { id: 15 },
  { id: -1 },
  { id: 0 },
  { id: 3 },
  { id: 12.2 },
  { },
  { id: null },
  { id: NaN },
  { id: 'undefined' }
];

var invalidEntries = 0;

function isNumber(obj) {
  return obj!== undefined && typeof(obj) === 'number' && !isNaN(obj);
}

function filterByID(item) {
  if (isNumber(item.id)) {
    return true;
  } 
  invalidEntries++;
  return false; 
}

var arrByID = arr.filter(filterByID);

console.log('Filtered Array\n', arrByID); 
// Filtered Array
// [{ id: 15 }, { id: -1 }, { id: 0 }, { id: 3 }, { id: 12.2 }]

console.log('Number of Invalid Entries = ', invalidEntries); 
// Number of Invalid Entries = 4

这会在FireBug中获得输出,如预期的那样:

Filtered array

[Object { id=15}, Object { id=-1}, Object { id=0}, Object { id=3}, Object { id=12.2}]
Number of Invalid Entries: 4

但我最初,不好意思但有意地键入了第一个console.log();声明如下:

  console.log('Filtered array\n' + arrById);

并得到了这个FireBug输出:

Filtered array
[object Object],[object Object],[object Object],[object Object],[object Object]

Number of Invalid Entries: 4

为什么输出不同?

2 个答案:

答案 0 :(得分:4)

使用obj上的<?php namespace AppBundle\Controller; use Symfony\Bundle\FrameworkBundle\Controller\Controller; use Symfony\Component\HttpFoundation\Request; use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route; class SecurityController extends Controller { /** * @Route("/login", name="login") */ public function loginAction(Request $request) { $authenticationUtils = $this->get('security.authentication_utils'); $error = $authenticationUtils->getLastAuthenticationError(); // last username entered by the user $lastUsername = $authenticationUtils->getLastUsername(); return $this->render('security/login.html.twig', array( 'last_username' => $lastUsername, 'error' => $error, )); } } 调用+方法进行同步,因此返回字符串'object'而不是返回使用toString返回的obj属性(name:value)通过console.log()输出连接。

答案 1 :(得分:1)

拿这个简单的对象:

var obj = {
  test: 5,
  another: 'hello'
}

如果你这样做console.log(obj),你要求firebug做的就是记录你的对象。它知道如何以一种很好的方式处理对象,向您显示所有属性和值。

但是,如果你这样做console.log(obj.toString()),你会要求javascript将你的对象转换为字符串,然后再询问firebug如何显示它。作为一个字符串,firebug将只是按原样显示它。所以真正的问题是,为什么javascript会将对象转换为类似[object Object] ...的字符串?。您可以看到解释here

在您的问题中,通过使用+,您强制将对象转换为字符串,以便它可以与'Filtered array\n'位连接。

如果你想做你在问题中所做的事情,但仍然有一些有用的输出,你可以尝试JSON.stringify()。例如:console.log('Filtered array\n' + JSON.stringify(arrById));